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>
<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 []
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;
public void setsession(map<string, object> session) {
this.session = session;
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();
request.setattribute("r1", "r1");
session.setattribute("s1", "s1");
application.setattribute("a1", "a1");
第四种(实现servletrequestaware接口)
public void setservletrequest(httpservletrequest request) {
this.session = request.getsession();
this.application = session.getservletcontext();
模块包含:
<include file="url">将多个struts.xml配置文件合并
默认action配置:当所访问的action不存在是都提交给默认的 action
<default-action-ref name=""></default-action-ref>