早在struts2.0.*的时候,struts2的必备jar包需要如下几个:
commons-logging-*.jar Apache旗下commons项目的log日志包
freemarker-*.jar 一种前台页面模板,应用比较广泛
ognl-*.jar 动态图导航语言,struts2处理前台页面的核心语言,相当实用
struts2-core-*.jar struts2的核心包
xwork-core-*.jar webwork的核心包,因为struts2的前身是webwork,所以这个是必须的
只要满足这5个基本jar包就可以运行一个struts2的hello world
(注:*表示版本号,struts2不同版本,使用的jar包版本也可能不一样。)
但是后面版本,比如struts-2.1.8.1,必须再添加一个新jar包才能运行,不然启动就会报错:
commons-fileupload-1.2.1.jar 支持文件上传的jar包
在web.xml需要配置struts2滤镜,即当jsp向后台发送请求时需要经过struts2拦截分析处理,需要注意的是struts2与struts1和spring mvc的拦截机制不同,它是通过一个filter拦截的。
filter拦截器的类除了下面这个类以外,也可以引用“org.apache.struts2.dispatcher.FilterDispatcher”。
注意filter-mapping配置的url-pattern即拦截所有的请求,如果写成/*.action就只能拦截以.action结尾的请求。
<init-param>标签中的config指定struts2初始核心文件路径,struts.xml是最核心文件
- <filter>
- <filter-name>struts2</filter-name>
- <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
- <init-param>
- <param-name>config</param-name>
- <param-value>
- struts-default.xml,
- struts-plugin.xml,
-
- ../conf/common/struts2/struts.xml,
- </param-value>
- </init-param>
- </filter>
-
- <filter-mapping>
- <filter-name>struts2</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
下面介绍一些struts2常用的配置信息,注意这些配置都有合适的默认值,不是必须的。
属性struts.i18n.encoding:指定字符集编码,这个配置经常用到;
属性struts.action.extension:指定JSP哪些后缀请求是struts2的请求,常用配置
属性struts.devMode:当系统发生异常,在浏览器打印详细的错误消息,产品上线时间以设为false关闭
属性struts.enable.DynamicMethodInvocation:是否允许OGNL在JSP中直接调用java方法,不推荐使用
标签include:项目大的话,通常都会写很多struts2配置文件,然后通过include标签将其它配置文件引进来,需要注意的是如果struts.xml文件放在src根目录下,include的内容是支持通配符的,但是如果struts.xml文件放在其它位置就不能用通配符了,必须老老实实写路径,下面这个include就是struts.xml放在conf目录后引用其它文件的方式。
- <?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 file="struts-default.xml" />
-
-
- <constant name="struts.i18n.encoding" value="UTF-8"></constant>
-
- <!--该属性指定需要Struts 2处理的请求后缀,该属性的默认值是action,即所有匹配*.action的请求都由Struts 2处理
- 如果用户需要制定多个请求后缀,则多个后缀之间以英文逗号隔开-->
- <constant name="struts.action.extension" value="action,do"></constant>
-
-
- <constant name="struts.serve.static.browserCache" value="false"></constant>
-
-
- <constant name="struts.configuration.xml.reload" value="true"></constant>
-
-
- <constant name="struts.devMode" value="true" />
-
-
- <constant name="struts.enable.DynamicMethodInvocation" value="true" />
-
-
- <constant name="struts.ui.theme" value="simple"></constant>
-
-
- <constant name="struts.objectFactory" value="spring"></constant>
-
-
- <constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>
-
-
- <package name="CommonPackage" extends="struts-default" namespace="/common">
- <action name="toLoginPage">
- <result>/Web/login/page/login.jsp</result>
- </action>
- </package>
-
- <include file="../conf/common/struts2/interceptor-common-exception.xml"></include>
- </struts>
基于java web开发,我们经常会使用到servlet的内置对象:request、session、application等,通过struts2框架获取内置对象有四种方式:
(1)通过ActionContext来获得,获取的对象是不基于Servlet容器的;
(2)通过ServletActionContext获得,获取的对象是Servlet内置对象
- HttpServletRequest request = ServletActionContext. getRequest();
-
- HttpSession session = ServletActionContext. getRequest().getSession();
(3)通过Struts2提供的IOC实现RequestAware,SessionAware,ApplicationAware三个接口的抽象方法
(4)通过Struts2提供的IOC实现ServletRequestAware,ServletContextAware这两个接口的抽象方法,这种方式个人比较推荐,你只需要创建一个BaseAction实现IOC,其它Action继承BaseAction,随后就直接调用内置对象即可:
- public class BaseAction extends ActionSupport implements ServletRequestAware,
- ServletContextAware,ServletResponseAware{
-
- private static final long serialVersionUID = 1L;
-
-
- protected HttpServletRequest request ;
- protected ServletContext application;
- protected HttpServletResponse response;
- protected HttpSession session;
-
-
- @Override
- public void setServletRequest(HttpServletRequest arg0) {
- this.request = arg0;
- session = this.request.getSession();
- }
-
- @Override
- public void setServletContext(ServletContext arg0) {
- this.application = arg0;
- }
-
- @Override
- public void setServletResponse(HttpServletResponse arg0) {
- this.response = arg0;
- }
-
-
-
- @Override
- public String execute() throws Exception {
- request.setAttribute("requestKey", "requestValue");
- session.setAttribute("sessionKey", "sessionValue");
- application.setAttribute("applicationKey", "applicationValue");
- return SUCCESS;
- }
- }}