Struts.xml 配置
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="false" /> //常量名
<constant name="struts.devMode" value="false" /> //是否启动开发模式
<include file="example.xml"/>
<package name="default" namespace="/" extends="struts-default">
<default-action-ref name="index" />
<action name="index">
<result type="redirectAction">
<param name="actionName">HelloWorld</param>
<param name="namespace">/example</param>
</result>
</action>
</package>
一个package下可以配置多个action,一个action下也可以配置多个result
</struts>
web.xml
<?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">
<display-name></display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern> //把每个url提交到过滤器(org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilte)
</filter-mapping>
</web-app>
当未给action中的result标签启用name 时默认的为 success
package标签的功能相当于Java中的包
web应用发布时,首选经过web.xml的过滤,再到struts.xml的配置中找到相应的action
namespace:
namespace决定了action的访问路径
当namespace为空时,匹配其他namespace不匹配的情况(相当于switch中default情况)
web应用程序的访问路径:httP//localhost:端口/webapp/namespace/action
Action:具体的视图的返回可以由用户自定义action 决定
三中方式:
实现 action 的方式可以是一个普通的 java类里边必须包含一个public String execute(){}方法
可以实现action接口
也可以继承ActionSupport(通常使用这个)
当没有定义action 的class时,会调用系统默认的action 方法返回值仍旧 是“success",根据返回值确定具体的视图
路径问题:
Struts中是根据action的路径决定,不要使用相对路径,使用绝对路径
Action执行的时候并不一定要执行execute方法可以在配置文件中配置Action的时候用method=来指定执行哪个方法
也可以在url地址中动态指定(动态方法调用DMI)(推荐)action的name和namespace保持一致,可以实现一个action下动态的方法调用,在url中指定使用哪个方法(url中用!方法名)
使用通配符,遵循约定优于配置(约定的好,可以简化配置)
action类和视图jsp 的名称有公共部分,各个action 的名称风格统一,各个jsp的名称风格统一
接受参数:
三中方式:1.属性方法
视图页面的 url的请求参数和action中的属性名称要一致,当调用方法时,系统会自动调用setXXX方法将请求参数传递,
若果类型不匹配会自动完成类型转换,构造函数必须是空参数的
2. DomainModel(域模型)或者增加 DTO(数据传输对象)方式
域模型就是一系列的对象模型,给出一系列的对象模型,在action中创建域模型对象,同样给出set和get方法以及构造函数
在url中使用对象名.属性名=valuel进行传值,系统会自动为我们创建一个相应的对象,然后调用域模型对象的set方法,之后调用action 的set对象的方法
3.模型驱动方式
解决中文问题:
在struts中增加 <constant name="struts.i18n.encoding" value="GBK" />配置 struts.i18n.encoding指的是国际标准化编码
简单的数据校验:
this.addFieldError("属性字段","错误信息"),可以向前台传送属性错误信息;在前台获取错误信息:
调用 struts 的标签库:<%@taglib uri="" prefix=" s"%> url指定路径,prefix指定使用标签的前缀,当错误信息在前台呈现时, struts2会使用<ul><li class="errorMessage">信息</li></ul>
<s:debug><s:debug>可以生成一个debug连接,会有一个键值栈,其中包含:Property Name 和Property Value
Struts ValueStack Debug(值占区)内容(访问直接使用property Name):
Object Property Name Property Value
texts
对象
actionErrors []
errors {关键字=[内容1,内容2],[],[]...}
PersonAction.personAction(Action 的路径) fieldErrors {关键字=[内容1,内容2],[],[]...}
errorMessages []
locale
actionMessages []
texts
Stack Context(栈环境) 区:(访问方式:#key)<以下只列出常用的>
key value
request
action
parameters
application
attr
session
可以通过<s:property value="property name" />获取相应的property value(注:标签前边的前缀是由引用标签库时指定的)
访问web元素:
获取Map类型的request,session,application,HttpServletRequest,HttpSession,servletContext
第一种方式(可以放到构造函数中,也可以放到execute()方法中:
request=(Map)ActionContext.getContext().get("request");
session=(Map)ActionContext.getContext.getSession();
application=(Map)ActionContext.getContext().getApplication();
第二种方式(使用泛型,实现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;
}
第三种:
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;
}
第四种(实现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();
}
模块包含:
<include file="url">将多个struts.xml配置文件合并
默认action配置:当所访问的action不存在是都提交给默认的 action
<default-action-ref name=""></default-action-ref>