培训第27天----Struts2框架初识(2)

               每天学的知识真的很少,但是就算一点点的积累不也是收获吗?(安慰自己。。。。)

一.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类中的一些

现成的方法。提一下,接口中可以有常量,并且实现类实现了接口之后,实现类中也会有接口中的常量。

猜你喜欢

转载自blog.csdn.net/qq_41160264/article/details/81542693
今日推荐