传智播客 struts1.x 控制器详解

 

    学习struts时,可以大致将struts中的常见类划归为不同的MVC模式中的组件,这样有助于理解struts的原理。这些常见的类有ActionServlet、Action Classes、ActionMapping(ActionForward)、ActionFormBean等。首先来看一下ActionForm,查看struts文档,官方将ActionForm归类为控制层组件而不是模型层的。ActionForm作为控制层组件为模型层和视图层传递数据。在struts中,开发者实现商务逻辑的类和自己写的相关的JavaBean。视图是由与控制器Servlet配合工作的一整套JSP定制标签库构成,利用它们可以快速建立应用系统的界面。而控制器就是前面所提到的前端控制器以及它将客户端请求转发到相应的后端控制器Action类。从上面可以看出,struts的主要功能部件在控制器这一块,模型层几乎没有,视图层也只有一套JSP定制标签库。接下来就来逐个分析struts里面这些常见的类。
    ActionServlet是中心控制器,它继承自javax.servlet.http.HttpServlet类,所以对于web应用来说,它就是一个servlet,需要在web.xml中配置ActionServlet的映射。ActionServlet作为中心控制器,它提供了一个中心位置来处理全部的终端请求(*.do),它的作用有接受请求、填充数据、派发请求、响应用户等。标准的ActionServlet初始化时是基于其配置的servlet初始化参数,通常之需要配置config参数,这个参数名时固定的,不能更改的。通常配置文件是放置在WEB-INF目录下的,也可以放置在其它地方,但是配置的时候要写对应的目录名。config参数也可以不配置,因为如果没有找到config参数的配置,会默认去/WEB-INF/struts-config.xml路径下读取配置文件。因此如果将配置文件放置在默认位置且名字也保持默认,则应用程序能照常运行。而且配置文件可以不只一个,可以用以逗号分隔的相对应用程序根目录的全路径名进行配置。
    Action也是属于控制器层的,它是HTTP请求内容与相应的需要执行的业务逻辑之间的适配器。Action是何时初始化的?比较简单的想法一个是当ActionServlet初始化读取配置文件的时候,还一个就是当用户的请求到达ActionServlet的时候。为了说明问题,可以建立一个工程来验证一下,可以在前面的AddStudentAction中添加如下的构造方法:
      public AddStudentAction(){
          System.out.println("初始化了...");
      }
    添加了如上构造方法后,再次运行web应用程序,会发现刚启动的时候并没有该语句打印出来,但是当在浏览器中发送第一次请求后,控制台就打印出了该语句。这说明Aciton是在请求第一次到达的时候进行初始化的。了解了什么时候初始化,还需要知道的是每个Action初始化几次?这个很简单就能解决了,可以在上次的基础上再开一个浏览器继续发送一个请求,这次请求执行完后发现在控制台上没有再次出现上面的打印语句,所以这就说明了一个Action只初始化一次,并且是在第一次请求到来的时候进行唯一的一次初始化。还有一个问题可以测试一下,就是当两个Action配置的path不同但是type相同时,struts也只是初始化一次该Action。读struts api文档发现Action需要用线程安全的方式编程,因为控制器对多个同步的请求会共享同一个实例。因此就需要遵循以下原则:
      1.实例变量和静态变量不能存储与某一个请求情况相关的信息,但是它们可以用来共享访问同一个Action的全局的资源信息。
      2.如果某些资源需要保护,那么访问这些资源时就应该进行同步处理。
    下面利用这个特性来做一个统计一个Action访问次数的应用,同时也写了一个比较另类的Action,直接往客户端写数据,不跳转到显示层的的页面。
      public class CountAction extends Action {
          private Integer count = 0;
          public ActionForward execute(ActionMapping mapping, ActionForm form,
                  HttpServletRequest request, HttpServletResponse response)
                  throws Exception {
              synchronized (count) {
                  count++;
              }
              PrintWriter out = response.getWriter();
              out.println("count="+ count);
              return null;
          }
      }
    以上就是Action的代码,设置一个实例变量,然后在execute方法中进行同步自增运算,每次请求后将当前值输出到浏览器端。然后在配置文件中配置一个action元素就可以了,只有path和type属性。最后这个例子就实现统计Action的访问次数的功能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值