struts2总结

来源:百度文库 编辑:神马文学网 时间:2024/04/28 05:25:42

32、Action是如何获得参数的?
   Struts 2用户处理用户请求的Action实例,并不是用户实现的业务逻辑控制器,而是Action代理----因为用户实现的业务逻辑控制器并没有与Servlet API耦合,显然无法处理用户请求.而Struts 2框架提供了系列拦截器,该系列拦截器负责将HttpServletRequest请求中的请求参数解析出来,传入到Action中,并回调Action的execute方法来处理用户的请求.
   显然,上面的处理过程是典型的AOP处理方式.
   用户实现的Action类仅仅是Struts 2的Action代理的代理目标.用户实现的业务控制器则包含了对用户请求的处理.用户的请求数据包含在HttpServletRequest对象里,而用户的Action类无需访问HttpServletRequest对象.拦截器负责将HttpServletRequest里的请求数据解析出来,并传给逻辑组件Action实例.

 

33、Request对象的getRemoteAddr()方法
   在开发过程中使用request对象的getRemoteAddr()方法时,返回的是0:0:0:0:0:0:0:1,而不是127.0.0.1(回送地址,指本地机,一般用于测试)。那为什么返回的不是我们看到的127.0.0.1呢?实际上0:0:0:0:0:0:0:1是IPv6协议的表示形式,而127.0.0.1是IPv4的表示形式。用于我用的是Win7操作系统,它支持IPv6,所以显示的时候就用IPv6显示出来了,解决的办法是找到C:\Windows\system32\drivers\etc\ hosts这个文件,如果看到是这样
# localhost name resolution is handled within DNS itself.
#    127.0.0.1       localhost
#       ::1             localhost
那就把上面一个的“#”去掉,如果下面一个没有“#”,那么就加上。

 

33、Struts 2中的ActionContext何ServletActionContext
   Struts 2的Action并未直接与任何的Servlet API耦合,这是Struts 2的一个改良之处,因为Action类不再与Servlet API耦合,从而能够更轻松地测试该Action。
   但对于Web应用的控制器而言,不访问Servlet API几乎是不可能的,例如跟踪HTTP Session状态等。Struts 2 框架提供一种更轻松地方式访问Servlet API。Web应用中通常需要访问的Servlet API就是HttpServletRequest、HttpSession和ServletContext,这三个类分别代表JSP内置对象中的request、session和application。

Struts 2提供了一个ActionContext类,Struts 2的Action可以通过该类来访问Servlet API。
 ServletActionContext继承ActionContext,它提供了直接与Servlet容器交互的路径。
ActionContext和ServletActionContext有着一些重复的功能,在我们的Action中,该如何去抉择呢?我们遵循的规则是:如果ActionContext能够实现我们的功能,那最好就不要使用ServletActionContext,让我们的Action尽量不要直接去访问Servlet相关的对象。
注意:在使用ActionContext时有一点要注意: 不要在Action的构造函数里使用ActionContext.getContext(),因为这个时候ActionContext里的一些值也许没有 设置,这时通过ActionContext取得的值也许是null;同样,HttpServletRequest req = ServletActionContext.getRequest()也不要放在构造函数中,也不要直接将req作为类变量给其赋值。至于原因,我想是因 为前面讲到的static ThreadLocal actionContext = new ActionContextThreadLocal(),从这里我们可以看出ActionContext是线程安全的,而 ServletActionContext继承自ActionContext,所以ServletActionContext也线程安全,线程安全要求每 个线程都独立进行,所以req的创建也要求独立进行,所以ServletActionContext.getRequest()这句话不要放在构造函数 中,也不要直接放在类中,而应该放在每个具体的方法体中(eg:login()、queryAll()、insert()等),这样才能保证每次产生对象 时独立的建立了一个req。
struts2中获得request、response和session
(1)非IoC方式
方法一:使用org.apache.struts2.ActionContext类,通过它的静态方法getContext()获取当前Action的上下文对象。
ActionContext ctx = ActionContext.getContext();
ctx.put("liuwei", "andy"); //request.setAttribute("liuwei", "andy");
Map session = ctx.getSession(); //session
HttpServletRequest request = ctx.get(org.apache.struts2.StrutsStatics.HTTP_REQUEST);
HttpServletResponse response = ctx.get(org.apache.struts2.StrutsStatics.HTTP_RESPONSE);
细心的朋友可以发现这里的session是个Map对象, 在Struts2中底层的session都被封装成了Map类型. 我们可以直接操作这个Map对象进行对session的写入和读取操作, 而不用去直接操作HttpSession对象.
方法二:使用org.apache.struts2.ServletActionContext类
public class UserAction extends ActionSupport {
    
    //其他代码片段
    
    private HttpServletRequest req;
// private HttpServletRequest req = ServletActionContext.getRequest(); 这条语句放在这个位置是错误的,同样把这条语句放在构造方法中也是错误的。
    public String login() {
        req = ServletActionContext.getRequest(); //req的获得必须在具体的方法中实现
        user = new User();
        user.setUid(uid);
        user.setPassword(password);
        if (userDAO.isLogin(user)) {
            req.getSession().setAttribute("user", user);
            return SUCCESS;
        }
        return LOGIN;
    }
    public String queryAll() {
        req = ServletActionContext.getRequest(); //req的获得必须在具体的方法中实现
        uList = userDAO.queryAll();
        req.getSession().setAttribute("uList", uList);
        return SUCCESS;
    }
    
    //其他代码片段