struts2配置
找一个基础的struts2的项目
- 将WEB-INF目录下的jar包拷贝过来
- 将struts.xml文件拷贝到src目录下
- 配置web.xml,将现有项目中
<filter>
的内容拷贝到现有项目中 - 配置struts.xml文件,将
<struts>...<struts>
中间的内容全部注释, 单独将<package>
的内容拷贝出来,并删除其他内容,只保留
<action name="hell">
<result >
/Hello.jsp
</result>
</action>
并且修改action
的名字,以及result
5. 将项目设置为开发模式,是的改动随时能够体现出来
<constant name="struts.devMode" value="true" />
Struts2的基本执行流程
核心思想:将请求和试图分开
- 1.client 收到http请求
- 2.client将请求提交给tomcat
- 3.tomcat收到请求后参照配置文件web.xml中的
filter
,然后提交给struts2filter去处理(调用doFilter()
)。 - 4.struts2filter参考配置文件struts.xml文件,首先参考
namespace="/"
,然后找对应的action
, 然后找对应的<result>
,最后将对应的请求forward给对应的.jsp文件。- 4.1 若没有对应的
namespace
则返回web.xml交给Tomcat去处理。
- 4.1 若没有对应的
- 5.
.jsp
文件将结果(展现, 视图)反馈return
给客户端。
Action
主要内容
- Namespace
- 定义自己的Action
- 路径设置
- 调用Action的自定义方法
- 通配符
- 接收用户输入(三种方式)
- 乱码问题解决
- 简单数据校验
- action中访问web元素
- 包含模块配置文件
- 默认action
namespace
package
Java中是给类打个包,解决重名的问题。
此处类似,action的名字相同的情况下,可以使位于不同的package下。
struts.xml文件解读
- namespace必须以
/开头
,访问的时候也要加/
- result的名字默认为
success
可以不写。<result name="success" >
namespace
为空 只要找到名字index
(也可以为其他)的action
而且没有找到和他精确对应的package
时,都交给该package
处理。即囊括了其他package
处理不了的action
。- 上图的访问地址为,其中
.action
可以省略。
http://localhost:8080/Struts2_0200_NameSpace/front/index.action
action实现
- 具体视图的返回可以由用户自己定义的Action来决定
- 具体的手段是根据返回的字符串找到对应的配置项,来决定试图的内容
- 具体的Action的实现可以是一个普通的Java类,里面有public String execute方法即可或者实现Action接口
- 不过最常见的是从ActionSupport继承,好处在于可以直接使用Struts是封装好的方法
路径问题
struts中的路径问题是根据action的路径而不是jsp的路径来确定的,所以尽量不要使用相对路径。
DML(动态方法调用)
<package name="user" namespace="/user" extends="struts-default">
<action name="userAdd" class="com.UserAction" method="add">
<result name = "success">
/user_add_success.jsp
</result>
</action>
<action name="user" class="com.UserAction">
<result name = "success">
/user_add_success.jsp
</result>
</action>
</package>
- 如上所示:一个
package
配置了两个action
,都调用了com.UserAction
类,第一个action
制定了调用方法add()
,然后利用add
的返回值success
,调用相应名字的result
,这是静态调用。 - 第二个
action
只指定了相应的类,没有指定调用的方法,就可以根据???(不是很理解)动态绑定相应的result
。
通配符的使用
原则:约定优于配置
<package name="actions" namespace="/actions" extends="struts-default">
<action name="Student*" class="com.StudentAction" method="{1}">
<result name = "{1}_success">
/Student{1}_success.jsp
</result>
</action>
</package>
*
通配符- client 端请求如下
http://localhost:8080/Struts2_0600_Wildcard/actions/Studentadd.action
http://localhost:8080/Struts2_0600_Wildcard/actions/Studentdelete.action
com.StudentAction
的函数如下:
public class StudentAction extends ActionSupport{
public String add() {
System.out.println("add");
return "add_success";
}
public String delete() {
System.out.println("delete");
return "delete_success";
}
}
- 两个请求只用使用一个
action
就可以了。 - 进一步可以扩大通配符的使用,一定要注意约定大于配置的原则
<package name="actions" namespace="/actions" extends="struts-default">
<action name="*_*" class="com.{1}Action">
<result name = "{1}_{2}">
/{1}_{2}_success.jsp
</result>
</action>
</package>
接收参数
1.按照属性接收参数
public class UserAction extends ActionSupport{
private String name;
private int age;
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public String add() {
System.out.println("name = " + name);
System.out.println("age = " + age);
return "add_success";
}
}
- 在action中定义属性用于接收参数,这里是使用
set
方法来接收参数,所以要注意方法的名字和参数传递的名字的问题。 - 参数传递在链接后直接加入参数值即可。
<a href="user/useradd.action?name=<%="admin" %>&age=<%= 23 %> ">添加学生</a><br>
2. DomainModel(域模型接收)
- 直接接收到对象中
- 参数传递形式
<a href="user/useradd.action?user.name=<%="admin" %>&user.age=<%= 23 %>">添加学生</a><br>
简单数据验证
在action
中使用addFieldError
方法对接收到的数据进行验证
action
中相应的函数
if(name == null || !name.equals("admin")) {
this.addFieldError("name", "name is error");
this.addFieldError("name", "名字不正确!");
System.out.println("error");
return ERROR;
}
- 在
.jsp
中接收返回的结果
<s:fielderror fieldName="name" theme="simple"></s:fielderror> <br>
<br>
<s:property value="errors.name"/>
<s:property value="errors.name[1]"/>
<br>
<s:debug></s:debug>
访问web元素(request
, session
, application
)
最常用的方法IOC(Inverse of Control)
反向控制 或者称为DI (denpenency input)
依赖注入。
流程如图所示
- 此处的
aciont
要实现RequestAware
的接口,并实现setRequest()
的方法; struts2
在调用相应的action
的时候会直接询问是否继承了上述接口并实现了方法,若是, 便调用该方法为action
注入相应的元素。
模块包含
直接在struts.xml
中使用include
,就可以将其他的struts文件**.xml
直接引用进来,(相当于直接粘贴到此处)属于struts.xml
文件的内容。
默认action
若找不到相应的action
,就默认访问这个action
。
Result结果集
结果集类型
全局result
概念:同一个package
下的action
可以共用。
也可以使用extends
继承另一个packaga
的结果集。默认继承"struts-default"
动态结果集
${}
: 用于在配置文件里,向值栈(value stack)里边取值。同时根据取得的结果动态指定不同的result
。
配置文件
action文件
带参数的结果集
一次request
只有一个值栈,使用forward
进行跳转的action共用一个值栈,因为他们共用一个request
。所以不用传递参数。
但是redirect
需要,因为redirect
会发起新的request
,建立新的值栈。