1、通过struts.properties配置文件修改struts2框架的全局行为:
当然,也可以在struts.xml文件中通过<constant name="键" value="值"/>来定义。
#指定Web应用的默认编码集,相当于调用HttpServletRequest的setCharacterEncoding方法
struts.i18n.encoding=UTF-8
#该属性指定需要Struts 2处理的请求后缀,该属性的默认值是action,即所有匹配*.action的请求都由Struts2处理。如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开。
struts.action.extension=do
#设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭
struts.serve.static.browserCache=false
#当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生产环境下使用),开发阶段最好打开
struts.configuration.xml.reload=true
#开发模式下使用,这样可以打印出更详细的错误信息
struts.devMode=true
#默认的视图主题
struts.ui.theme=simple
#spring 托管
struts.objectFactory=spring
#指定加载struts2配置文件管理器,默认为org.apache.struts2.config.DefaultConfiguration,开发者可以自定义配置文件管理器,该类要实现Configuration接口,可以自动加载struts2配置文件。
struts.configuration=org.apache.struts2.config.DefaultConfiguration
#设置默认的locale和字符编码
struts.locale=zh_CN
struts.i18n.encoding=GBK
#指定Struts的工厂类
struts.objectFactory=spring
#指定spring框架的装配模式,装配方式有: name, type, auto, and constructor (name是默认装配模式)
struts.objectFactory.spring.autoWire=name
#该属性指定整合spring时,是否对bean进行缓存,值为true or false,默认为true
struts.objectFactory.spring.useClassCache=true
# 指定类型检查,包含tiger和notiger
struts.objectTypeDeterminer=tiger
# 该属性指定处理 MIME-type multipart/form-data,文件上传
struts.multipart.parser=cos
struts.multipart.parser=pell
struts.multipart.parser=jakarta
# 指定上传文件时的临时目录,默认使用 javax.servlet.context.tempdir
struts.multipart.saveDir=/tmpuploadfiles
#该属性指定Struts 2文件上传中整个请求内容允许的最大字节数
struts.multipart.maxSize=2097152
#该属性指定Struts2应用加载用户自定义的属性文件,该自定义属性文件指定的属性不会覆盖struts.properties文件中指定的属性。如果需要加载多个自定义属性文件,多个自定义属性文件的文件名以英文逗号(,)隔开。(也就是说不要改写struts.properties!)
struts.custom.properties=application,org/apache/struts2/extension/custom
#指定请求url与action映射器,默认为org.apache.struts2.dispatcher.mapper.DefaultActionMapper
struts.mapper.class=org.apache.struts2.dispatcher.mapper.DefaultActionMapper
#指定action的后缀,默认为action
struts.action.extension=do
#被 FilterDispatcher使用指定浏览器是否缓存静态内容,测试阶段设置为false,发布阶段设置为true.
struts.serve.static.browserCache=true
#设置是否支持动态方法调用,true为支持,false不支持.
struts.enable.DynamicMethodInvocation=true
#设置是否可以在action中使用斜线,默认为false不可以,想使用需设置为true.
struts.enable.SlashesInActionNames=true
#是否允许使用表达式语法,默认为true.
struts.tag.altSyntax=true
#设置当struts.xml文件改动时,是否重新加载
struts.configuration.xml.reload=true
#设置struts是否为开发模式,默认为false,测试阶段一般设为true.
struts.devMode=true
#设置是否每次请求,都重新加载资源文件,默认值为false.
struts.i18n.reload=false
#标准的UI主题,默认的UI主题为xhtml,可以为simple,xhtml或ajax
struts.ui.theme=xhtml
#模板目录
struts.ui.templateDir=template
#设置模板类型. 可以为 ftl, vm, or jsp
struts.ui.templateSuffix=ftl
#定位velocity.properties 文件. 默认velocity.properties
struts.velocity.configfile=velocity.properties
#设置velocity的context.
struts.velocity.contexts=....
#定位toolbox
struts.velocity.toolboxlocation=....
#指定web应用的端口
struts.url.http.port=80
#指定加密端口
struts.url.https.port=443
#设置生成url时,是否包含参数.值可以为: none,get or all
struts.url.includeParams=get
#设置要加载的国际化资源文件,以逗号分隔.
struts.custom.i18n.resources=application
#对于一些web应用服务器不能处理HttpServletRequest.getParameterMap(),像 WebLogic,Orion, and OC4J等,须设置成true,默认为false。
struts.dispatcher.parametersWorkaround=false
#指定freemarker管理器
struts.freemarker.manager.classname=org.apache.struts2.views.freemarker.FreemarkerManager
#设置是否对freemarker的模板设置缓存,效果相当于把template拷贝到 WEB_APP/templates.
struts.freemarker.templatesCache=false
#通常不需要修改此属性.
struts.freemarker.wrapper.altMap=true
#指定xslt result是否使用样式表缓存.开发阶段设为true,发布阶段设为false.
struts.xslt.nocache=false
#设置struts自动加载的文件列表.
struts.configuration.files=struts-default.xml,struts-plugin.xml,struts.xml
</pre><pre name="code" class="plain">#用户通过struts.action.excludePattern常量来提供一组逗号间隔的正则表达式,来告诉Struts2不需要对哪些URL进行处理。
struts.action.excludePattern=/static/content/.*?
#设定是否一直在最后一个slash之前的任何位置选定namespace.
struts.mapper.alwaysSelectFullNamespace=false
2、struts2拦截器配置详解
@Override
public void destroy() {
}
@Override
public void init() {
}
@Override
public String intercept(ActionInvocation arg0) throws Exception {
return null;
}
<interceptor name="名称" class="类的全类名"/>
<interceptor-stack name="拦截器栈名称">
<interceptor-ref name="拦截器名"/>
</interceptor-stack>
<default-interceptor-ref name="拦截器栈名称"/>
在拦截器类中的常用方法: // 获取getAction()获取进来的action
arg0.getAction();
// 获取到action类中可以用instanceOf方法来判断是否是需要的action类
// 放行的方法
arg0.invoke();
// ActionInvocation获取session
arg0.getInvocationContext().getSession();
3、struts2常用对象介绍
它是一个Action的上下文对象,Action运行期间所用到的数据都保存在ActionContext中。在Action中可以通过ActionContext.getContext()方法来获取ActionContext对象。其常用的方法如下:
Object get(Object key):通过指定的参数key获取当前ActionContext中的值
Map getApplication():返回一个Application的Map对象
static ActionContext getContext():获取当前线程的ActionContext对象
Map getParameters():返回一个包含有HttpServletRequest参数信息的Map对象
Map getSession():返回一个Map类型的HttpSession对象
这里注意:这里的session就是Map类型的对象;原因:WebWork框架将与Web相关的很多对象重新进行了包装,这里将HttpSession对象重新包装成了一个Map对象,提供给Action使用,而不用直接和底层的HttpSession打交道。也正是框架的包装,让我们的Actoion可以完全的和Web层解藕。
void put(Object key,Object value):向当前ActionContext对象中存入键和值
void setSession(Map session):设置一个Map类型的Session值
void setApplication(Map application):设置一个Map类型的Application上下文
4、在Action中获取:request,session,application
【注意1】:我们需要知道前两种方法得到的是Map<String,Object>,而后两种方式得到的才是真正的request等对象。而Map就是把request对象中的属性取出做成了键值对而已。
【注意2】:另外如果就是为了在action和jsp传递参数的话,只需要在action中定义成员,然后Jsp中利用struts标签<s:property value="name"/>就能够访问到数据,而这些内容都是被保存在了value stack中。关于value stack 和 stack context 会在后面得内容涉及。
// 方法一:
public class LoginAction1 extends ActionSupport {
private Map request;
private Map session;
private Map application;
public LoginAction1() {
request = (Map)ActionContext.getContext().get("request");
session = ActionContext.getContext().getSession();
application = ActionContext.getContext().getApplication();
}
public String execute() {
request.put("r1", "r1");
session.put("s1", "s1");
application.put("a1", "a1");
return SUCCESS;
}
}
// 方法二:
public class LoginAction2 extends ActionSupport implements RequestAware,SessionAware, ApplicationAware {
private Map<String, Object> request;
private Map<String, Object> session;
private Map<String, Object> application;
//DI dependency injection
//IoC inverse of control
public String execute() {
request.put("r1", "r1");
session.put("s1", "s1");
application.put("a1", "a1");
return SUCCESS;
}
? @Override
public void setRequest(Map<String, Object> request) {
this.request = request;
}
@Override
public void setSession(Map<String, Object> session) {
this.session = session;
}
@Override
public void setApplication(Map<String, Object> application) {
this.application = application;
}
}
// 方法三:
public class LoginAction3 extends ActionSupport {
private HttpServletRequest request;
private HttpSession session;
private ServletContext application;
public LoginAction3() {
request = ServletActionContext.getRequest();
session = request.getSession();
application = session.getServletContext();
}
public String execute() {
request.setAttribute("r1", "r1");
session.setAttribute("s1", "s1");
application.setAttribute("a1", "a1");
return SUCCESS;
}
}
// 方法四:
public class LoginAction4 extends ActionSupport implements ServletRequestAware {
private HttpServletRequest request;
private HttpSession session;
private ServletContext application;
public String execute() {
request.setAttribute("r1", "r1");
session.setAttribute("s1", "s1");
application.setAttribute("a1", "a1");
return SUCCESS;
}
@Override
public void setServletRequest(HttpServletRequest request) {
this.request = request;
this.session = request.getSession();
this.application = session.getServletContext();
}
}
4、Action的驱动模式:就是form表单提交打Action中,Action如何获取表单的值
【模型驱动】
Action要实现带有泛型的ModelDriven<T>类,并覆盖其getModel方法,实例如下:public class LoginAction extends ActionSupport implements ModelDriven<User>{
// 并不会帮你创建User对象,需要自己手动创建,一般将其私有化。
private User user = new User();
@Override
public User getModel(){
return user;
}
}