Struts 2开发基本流程
Struts 2工作流程
Struts2是一个基于MVC设计模式的Web开发框架, 正如官网上介绍的那样:
ApacheStruts 2 is an elegant, extensible framework for creating enterprise-ready Javaweb applications. The framework is designed to streamline the full developmentcycle, from building, to deploying, to maintaining applications over time.
Struts2是由Struts和Webwork这两个优秀的框架演化而来,它的出现解决了表现层和业务逻辑层紧耦合的问题。
为了支持Struts 2,通常我们需要添加以下类库:
- commons-fileupload.jar 文件上传
- commons-io.jar I/O类库
- commons-lang-2.4.jar Java.lang包
- commons-lang3-3.1.jar Java lang包扩展
- commons-logging.jar 日志
- freemarker-2.3.19.jar 表现层框架
- javassist-3.9.0.GA.jar 代码生成工具Hibernate用它在运行时扩展java类和实现,同cglib包
- ognl-3.0.6.jar 对象图导航语言
- struts2-core-2.3.14.2.jar Struts2核心组件
- struts2-json-plugin-2.3.14.2.jar Struts2对Json数据格式支持(非必须)
- xwork-core-2.3.14.2.jar webwork核心类库
接下来编辑Web应用中的web.xml,配置Struts2的核心类库,下面是配置文件的代码片段,在web.xml文件中,定义了框架的拦截器FilterDispatcher,Servlet初始化Struts框架并且处理所有请求。“/*”表示对于所有的请求都允许。
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <filter> <!-- 定义Struts2的核心Filter --> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> <init-param> <param-name>actionPackages</param-name> <param-value>com.mycompany.myapp.actions</param-value> </init-param> </filter> <!-- 让struts2的核心Filter拦截所有的请求 --> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- web应用的默认首页 --> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
Jsp页面(welcome.jsp和error.jsp省略):login.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@taglib prefix="s" uri="/struts-tags"%> <body> <s:form action="login.action"> <s:textfield name="username" key="user"></s:textfield> <s:textfield name="password" key="pass"></s:textfield> <s:submit key="login"></s:submit> </s:form> </body>
Action类:
import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; public class Demo extends ActionSupport { private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String execute() throws Exception { if (getUsername().equals("Beta")) { ActionContext.getContext().getSession().put("user", getUsername()); System.out.print(getUsername()); return SUCCESS; } else { return ERROR; } } }
接下来需要配置stuts.xml文件,该文件的最大作用就是配置Action和请求之间的对应关系,并配置逻辑视图名和物理视图资源之间的关系。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <!-- 指定全局国际化资源文件 --> <constant name="struts.custom.i18n.resources" value="mess" /> <!-- 指定国际化编码字符集 --> <constant name="struts.i18n.encoding" value="UTF-8" /> <package name="no-default" extends="struts-default"> <action name="login" class="ntci.cloud.openstack.action.Demo"> <!—定义了三个逻辑视图和物理视图之间的映射 --> <result name="input">/login.jsp</result> <result name="error">/error.jsp</result> <result name="success">/welcome.jsp</result> </action> </package>
它的整个业务流程如下图所描述的:
1. 在web.xml中定义核心的Filter来拦截用户的请求;
2. 在struts.xml中查找匹配的Action实例,并调用该Action的业务逻辑方法,上图中如果用户请求url为login.action,则使用ntci.cloud.openstack.action.Demo来处理;
3. 当Action处理用户请求完毕后,通常会返回一个处理结果,通常我们称之为逻辑视图名,这个逻辑视图和物理视图进行关系映射;
4. Action将数据传给视图资源。
Struts 2常量配置
Struts2中有一些常量配置:
struts.i18n.encoding:指定web应用的指定编码集。该常量的默认配置是UTF-8,对于获取中文请求参数,应该将常量设置为GBK或者GBK2312
struts.devMode:该常量设置Struts2应用是否使用开发模式
Struts 2默认会加载类加载路径下的struts.xml、struts-default.xml、struts-plugin.xml三类文件,其中struts.xml是开发者定义的默认配置文件,struts-default.xml是struts 2框架自带的配置文件,而struts-plugin.xml则是Struts 2插件的默认配置文件。除了以上三个文件,我们也可以在struts.properties、web.xml文件中配置struts常量。在struts.xml文件中,在根目录下添加:
<constantname="struts.i18n.encoding" value="UTF-8" />
在web.xml文件filter目录下,添加
<init-param> <param-name> struts.i18n.encoding</param-name> <param-value> UTF-8</param-value> </init-param>
为了避免struts.xml过于庞大,我们可以将一个struts.xml配置文件分解为多个配置文件,然后在struts.xml文件中包含这些文件。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <!—通过include元素导入其它配置文件--> <include file=”struts-part1.xml”/> </struts>
Action类
Action类中的属性,不仅可以用于封装请求参数,也可以封装处理结果,Action类并不会对此进行区分。如果请求参数中包含了username属性,则系统会调用Action类中username的setter方法,通过这种方法,username参数就可以传给Action实例。
Struts 2提供了一个Action接口,这个接口提供了Struts2的Action类应该事先的规范,下面是Action接口的代码:
public interface 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 Exception; }
Struts 2为Action接口提供了一个实现类ActionSupport,为了方便开发,该类里面提供了很多默认方法,包括数据校验的方法、国际化信息的方法等。