您的位置:首页 > 编程语言 > Java开发

深入详解Struts2——Struts2初识

2015-09-24 10:43 274 查看
在讨论Struts2之前我们先简单说一下SpringMVC这个Web框架

SpringMVC Web框架是整个Spring集成框架中的一部分。SpringMVC框架是结构最清晰的MVC Model2的实现 ,它围绕DispatcherServlet进行设计。DispatcherServlet的作用是将请求分发给不同的处理器。SpringMVC是高度可配置的,包括可配的处理器(handler)映射、视图(view)解析、本地化(local)解析、主题(theme)解析以及上载文件支持。处理器是对Controller接口的实现,该接口只有一个方法

ModelAndView handleRequest(request,response);

在Struts2诞生之前我们一直在用Struts1,Struts1有两个比较明显的缺点是:

1、令人头疼的ActionForm,这是因为他增加了对象之间复杂的关系

2、单元测试困难,因为他需要依赖HttpServletRequest和HttpServletResponse,这两个类是由Servlet负责实例化的。

基于Struts2的Web应用程序所需要的最少类库

struts2-core-2.0.11.jar Struts2框架的核心类库

xwork-2.0.4.jar XWork类库,Struts2在其上构建

ognl-2.6.11.jar 对象图导航语言,Struts2框架使用的一种表达式语言

freemarker-2.3.8.jar Struts2的UI标签的模板使用freemarker编写

commons-logging-1.0.4.jar Struts2框架使用这个日志包来支持Log4j和JDK1.4+的日志记录

Web.xml文件中配置FilterDispatcher

Struts2框架是基于MVC模式开发的,他提供了一个核心控制器,用于对所有的请求进行统一处理,这个控制器是由一个名为FilterDispatcher的servlet过滤器来充当。

我们需要在web.xml文件中配置FilterDispatcher过滤器,指定要映射到FilterDispatcher的URL样式,匹配到这个URL样式的所有请求,都将被Web容器交由FilterDispatcher进行处理。

配置如下

<filter>
    <filter-name>struts2</filter-name>
    <filter-class>
        org.apache.struts2.dispatcher.FilterDispatcher
    </filter-class>
</filter>
<filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>


在Struts2中,action执行的结果通常都对应着一个要呈现给用户的result,这个result可以是HTML页面,也可以是一个PDF文件,或者是Excel电子表格。所有的result都是通过字符串名字来标识的。FilterDispatcher根据action返回的结果字符串来选择对应的result显示给用户,下面介绍下几个常量字符串含义

public interface Action{
    // action执行成功,要向用户显示成功页面,返回SUCCESS常量
    public static final String SUCCESS = "success";
    // action执行成功,但不需要向用户显示结果页面,使用NONE常量
    public static final String NONE = "none";
    // action执行失败,要向用户显示失败页面,返回ERROR常量
    public static final String ERROR = "error";
    // action的执行用户需要输入更多信息,要向用户显示输入页面,返回INPUT常量
    public static final String INPUT = "input";
    // 由于用户没有登录,action不能被执行,要向用户显示登录页面,返回LOGIN常量
    public static final String LOGIN = "login";
}


与Servlet API解耦的访问方式

为了避免与servlet API耦合在一起,方便Action类做单元测试,Struts2对HttpServletRequest、HttpSession和ServletContext进行了封装,构造了三个Map对象来替代这种对象,在Action中,直接使用HttpServletRequest、HttpSession和ServletContext对应的Map对象来保存好读取数据。

ActionContext是action执行的上下文,在ActionContext中保存了action执行所需的一组对象,包括parameters、request、session、application额locale等。

public Object get(Object key);
public Map getSession();
public Map getApplication();
ActionContext context = ActionContext.getContext();
HttpServletRequest request = ServletActionContext.getRequest();
HttpSession session = reqest.getSession();
ServletContext context = ServletActionContext.getServletContext();
Map request = (Map)context.get("request");// 没有封装类似getRequest()的方法
Map session = context.getSession();
Map application = context.getApplication();


Struts2除了用上述方式还可以让Struts2框架在运行时向Action实例注入request、session和application对象,方法如下:

org.apache.struts2.interceptor.RequestAware

框架利用该接口,向Action实例注入request Map对象:public void setRequest(Map request);

org.apache.struts.interceptor.SessionAware

框架利用该接口,向Action实例注入session Map对象:void setSession(Map session);

org.apache.struts.interceptor.ApplicationAware

框架利用该接口,想Action实例注入application Map对象:void setApplication(Map application);

例如:

public class LoginAction implements Action,RequestAware,SessonAware,ApplicationAware{
    private Map request;
    private Map session;
    private Map application;
    // get,set方法
    ...
}


public class LoginAction2 implements Action,ServletReqestAware,ServletContextAware{
    private HttpSerlvetRequest request;
    private ServletContext context;
    // get,set方法
    ...
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: