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
- 将项目设置为开发模式,是的改动随时能够体现出来
<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>