Servlet/JSP(三)

来源:互联网 发布:ubuntu 16.10 安装后 编辑:程序博客网 时间:2024/06/10 01:45

本篇主要介绍 Servlet 之间的跳转 Forward Redicect,以及Servlet线程安全

Servlet 之间可以互相跳转,从一个Servlet 调到另一个Servlet,利用这一功能,我们可以把任务进行模块划分,比如一个Servlet接收用户数据,另一个Servlet 读取数据库,另一个Servlet 把处理结果显示出来,Servlet的跳转可以实现程序模块化

比如MVC 架构中都使用Servlet的跳转,MVC 把程序分为 model view control ,Mode 负责业务处理,View 负责数据显示,Control 负责控制,在Struts 框架中 这三部分分别使用三个Servlet,程序在这三个Servlet之间跳转

转向 Forard

是通过 RequestDispatcher 对象的 forward 方法来实现的,RequestDispatcher 可以通过 HttpServletRequest 的getRequestDispatcher() 方法取得,比如

ReauestDispatcher dispatcher = request.getRequestDispather("/servlet/fowsardServlet")dispatcher.forward(request,response);

getRequestDispatcher() 方法的参数必须 以 / 开头,表示Web 应用程序的根目录

Foward 是MVC 框架中常用的一种技术,不仅可以跳转到本应用的一个 Servlet /JSP页面,也可以跳转到另一个文件,甚至 WEB-INF 文件夹下的文件,在Servlet/JSP 中是很常见的,框架中常使用 一个 Servlet 来集中处理请求然后跳转到响应的 Servlet,或者在Servlet 中处理业务逻辑,然后跳转到 JSP 页面中显示处理结果,当使用 forward 形式跳转Servlet 时,地址栏会显示跳转前的Servlet访问地址,因为该跳转是在服务器上实现的,客户端并不知道该动作,跳转是对客户端透明的

foward 是最常用的方式,在 Struts 等MVC 框架中,都是利用Servlet 来处理 用户请求,把结果通过request.setAttribute() 放到 request 中,然后 forward 到 JSP 显示,当 forward 动作不能有任何输出到客户端时,会抛出异常,所以我们尽量不要在 forward 之前使用 out.println 语句向客户端输出结果

重定向 redirect

重定向 是利用服务器返回的状态码来实现的,客户端浏览请求服务器的时候,服务器会返回一个状态码,通过 HttpServletResponse 的 setStatus 方法设置状态码,如果服务器返回的是 301 或是 302 浏览器会到新的网址重新请求该资源,常见状态码

状态码 说明 1xx 信息状态码,表示已经接受该请求,正在处理 2xxx 正确状态码,表示该请求已经被正确接受并处理,没有错误发生200 表示正确 3xxx 重定向状态码,301(永久) 302(临时) 表示资源不存在或是地址发生变化,客户端需要重新定向到一个新的资源,服务器响应中会附带这个新资源状态 4xxx 请求错误,401 表示没有访问权限,404表示资源不存在 405表示访问方式错误 5xxx 服务器错误,500 表示程序出现异常而停止

HttpServletResponse 把常用的状态码封装成 了静态的变量,我们要实现重定向 需要调用 setRedirection 就能实现重定向

自动刷新

自动刷新不仅可以实现一段时间之后自动跳转到另一个界面,还可以实现一段时间之后重新刷新本页面,Servlet 中通过 HttpServletResponse 对象设置 Header 属性实现自动刷新效果

response.setHeader("Refresh","1000;URL=http://loaclhost:8080/FirstServlet/index.html");

1000为毫秒,URL 为 跳转到指定页面路径,自动刷新与重定向的原理类似,如果把时间设置为 0 ,那么效果就是 重定向

线程安全

线程安全是指在多线程并发执行时出现的问题,如果会出现问题,就是线程不安全,反之
由于Servlet 只会有一个实例,多个用户同时请求同一个Servlet 时候,服务器会产生多条线程来执行Servlet 的代码,因此Servlet 有线程不安全的隐患,如果设计不合理,就会出现问题,多线程并发读写数据可能会导致数据不同步的问题,解决的并发是尽量不要使用 全局变量,要把全局变量 定义为 局部变量,虽然我们使用同步锁也可以解决,但是会造成线程等待,不是很科学的做法

多线程的并发读写Servlet类属性会导致数据不同步,但是如果只是并发读取属性而不是写入,那么就不会存在数据不同步的问题,因此,Servlet 里面的自读属性最好定义为 final 类型

0 0
原创粉丝点击