Struts2学习--Action

struts2配置

找一个基础的struts2的项目
  1. 将WEB-INF目录下的jar包拷贝过来
  2. 将struts.xml文件拷贝到src目录下
  3. 配置web.xml,将现有项目中<filter>的内容拷贝到现有项目中
  4. 配置struts.xml文件,将<struts>...<\struts>中间的内容全部注释, 单独将<package>的内容拷贝出来,并删除其他内容,只保留
        <action name="hell">
            <result >
                /Hello.jsp
            </result>
        </action>   

并且修改action的名字,以及result

  1. 将项目设置为开发模式,是的改动随时能够体现出来
<constant name="struts.devMode" value="true" />

Struts2的基本执行流程

核心思想:将请求和试图分开
struts2执行过程.png

  • 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去处理。
  • 5..jsp文件将结果(展现视图)反馈return给客户端。

Action

主要内容
  1. Namespace
  2. 定义自己的Action
  3. 路径设置
  4. 调用Action的自定义方法
  5. 通配符
  6. 接收用户输入(三种方式)
  7. 乱码问题解决
  8. 简单数据校验
  9. action中访问web元素
  10. 包含模块配置文件
  11. 默认action

namespace

package

Java中是给类打个包,解决重名的问题。
此处类似,action的名字相同的情况下,可以使位于不同的package下。

struts.xml文件解读

namespace解读.png

  1. namespace必须以/开头,访问的时候也要加/
  2. result的名字默认为success可以不写。<result name="success" >
  3. namespace为空 只要找到名字index(也可以为其他)的action而且没有找到和他精确对应的package时,都交给该package处理。即囊括了其他package处理不了的action
  4. 上图的访问地址为,其中.action可以省略。
http://localhost:8080/Struts2_0200_NameSpace/front/index.action

action实现

  1. 具体视图的返回可以由用户自己定义的Action来决定
  2. 具体的手段是根据返回的字符串找到对应的配置项,来决定试图的内容
  3. 具体的Action的实现可以是一个普通的Java类,里面有public String execute方法即可或者实现Action接口
  4. 不过最常见的是从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>
  1. 如上所示:一个package配置了两个action,都调用了com.UserAction类,第一个action制定了调用方法add(),然后利用add的返回值success,调用相应名字的result,这是静态调用。
  2. 第二个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>
  1. *通配符
  2. 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";
    }
}
  1. 两个请求只用使用一个action就可以了。
  2. 进一步可以扩大通配符的使用,一定要注意约定大于配置的原则
    <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>

猜你喜欢

转载自www.cnblogs.com/nce4/p/9469117.html