每天学的知识真的很少,但是就算一点点的积累不也是收获吗?(安慰自己。。。。)
一.Struts2的核心过滤器(控制器)FilterDispatcher
FilterDispatcher是Struts 2框架的核心控制器,该控制器作为一个Filter运行在Web应用中,它负责拦截所有的用
户请求,当 用户请求到达时,该Filter会过滤用户请求。如果用户请求以action结尾,该请求将被转入Struts 2框架处理。
Struts 2框架获得了*.action请求后,将根据*.action请求的前面部分决定调用哪个业务逻辑组件(action类),login.action
请求,Struts 2调用名为login的Action来处理该请求。 简单来说,就是通过FilterDispatcher控制器,过滤出*.action请求,
并根据前缀名来确定所要执行的action(自定义的action)。Struts 2应用中的Action都被定义在struts.xml文件中,Struts 2
用于处理用户请求的Act ion实例,并不是用户实现的业务控制器,而是Act ion代理。因为用户实现的业务控制器(自定义
的action类)并没有与Servlet API耦合,显然无法处理用户请求。而Struts 2框架提供了系列拦截器,该系列拦截器负责将
HttpServletRequest请求中的请求参数解析出来,传入到Action中,并回调Action的execute方法来处理用户请求。
二.Java 中重定向和请求转发的区别
1)实现转发的代码:
//转发,转发是在服务器端转发的,客户端是不知道的
request.getRequestDispatcher("/student_list.jsp").forward(request, response);
其中,forward(request,response)代码是将客户端发过来的请求处理权交给了别人,但它们仍然是一个请求,
在转发的过程中,传递的参数不会改变。
2)重定向的代码:
//重定向,不会共享request
//以下写法错误,该 "/"代表了8080端口
response.sendRedirect("/student_list.jsp");
response.sendRedirect(request.getContextPath() + "/student_list.jsp");
其中,由于重定向是将一个请求进行返回,它将结束客户端发来的请求,所以sendRedirect()方法要由响
应对象来调用,代码中request.getContextPath()的作用是获得 当前项目名。
下面我们来分析一下请求转发和重定向:
(1).转发过程:用户发送了一个请求(url),服务器调用相应的servlet进行相应,响应完成之后,将请求转
发到index.jsp页面,由于是转发,所以它是在服务器端进行的,servlet和index.jsp共用一个request请求对象,在servlet
中setAttribute()的参数,在index.jsp中都能getAttribute()出来。getAttribute()出来之后把结果返回给客户端,整个过程
是一个请求,一个xi响应。
(2)重定向:用户发送了一个请求(url),服务器调用相应的servlet进行响应,这部分是和请求转发一致的,
在servlet响应完成以后,会通过response对象的setRedirect()方法来进行重定向。它将告诉客户端,你必须在发送
一个请求,于是客户端按照要求又重新发送了一个请求,这就是为什么请求路径发生改变的原因。这里两个请求互不
干扰,相互独立,在前面request里面setAttribute()的任何东西,在后面的request里面都获得不了。可见,在sendRedir
ect()里面是两个请求,两个响应。
总结:
转发在服务器端完成的;重定向是在客户端完成的
转发的速度快;重定向速度慢
转发的是同一次请求;重定向是两次不同请求
转发不会执行转发后的代码;重定向会执行重定向之后的代码
转发地址栏没有变化;重定向地址栏有变化
转发必须是在同一台服务器下完成;重定向可以在不同的服务器下完成
Forward是在服务器端的跳转,就是客户端一个请求发给服务器,服务器直接将请求相关的参数的信息原封
不动的传递到该服务器的其他jsp或servlet去处理,而sendredirect是在客户端的跳转,服务器会返回给客户端一个
响应报头和新的URL地址,原来的参数什么的信息如果服务器端没有特别处理就不存在了,浏览器会访问新的URL所指
向的servlet或jsp,这可能不是原先服务器上的webservce了。
三.Struts2 继承ActionSupport的用处
Action 跟 Actionsupport 的区别:
我们在写action的时候,可以实现Action接口,也可以继承Actionsupport这个类.到底这两个有什么区别呢?
Action接口有:
public static final java.lang.String SUCCESS = "success";
public static final java.lang.String NONE = "none";
public static final java.lang.String ERROR = "error";
public static final java.lang.String INPUT = "input";
public static final java.lang.String LOGIN = "login";
public abstract java.lang.String execute() throws java.lang.Exception;
而Actionsupport这个工具类在实现了Action接口的基础上还定义了一个validate()方法,重写该方法,它会在
execute()方法之前执行,如校验失败,会转入input处,必须在配置该Action时配置input属性。
ActionSupport类的作用:
struts2不要求我们自己设计的action类继承任何的struts基类或struts接口,但是我们为了方便实现我们自
己的action,大多数情况下都会继承com.opensymphony.xwork2.ActionSupport类,并重写此类里的public String
execute() throws Exception方法。因为此类中实现了很多的实用接口,提供了很多默认方法,这些默认方法包括
国际化信息的方法、默认的处理用户请求的方法等,这样可以大大的简化Acion的开发。
简单来说,就是ActionSupport类中实现了很多的接口,继承它,就可以使用ActionSupport类中的一些
现成的方法。提一下,接口中可以有常量,并且实现类实现了接口之后,实现类中也会有接口中的常量。