Servlet/JSP(三)

本篇主要介绍 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 类型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值