zoukankan      html  css  js  c++  java
  • 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
    5. 将项目设置为开发模式,是的改动随时能够体现出来

    <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>
    

    接收参数

    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";
    	}
    }
    
    1. 在action中定义属性用于接收参数,这里是使用set方法来接收参数,所以要注意方法的名字和参数传递的名字的问题。
    2. 参数传递在链接后直接加入参数值即可。
    <a href="user/useradd.action?name=<%="admin" %>&age=<%= 23 %> ">添加学生</a><br>
    

    2. DomainModel(域模型接收)

    1. 直接接收到对象中
    2. 参数传递形式
     <a href="user/useradd.action?user.name=<%="admin" %>&user.age=<%= 23 %>">添加学生</a><br>
    

    简单数据验证

    action中使用addFieldError方法对接收到的数据进行验证

    1. action中相应的函数
    		if(name == null || !name.equals("admin")) {
    			this.addFieldError("name", "name is error");
    			this.addFieldError("name", "名字不正确!");
    			System.out.println("error");
    			return ERROR;
    		}
    
    1. .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) 依赖注入。
    流程如图所示
    IOC.png

    1. 此处的aciont要实现RequestAware的接口,并实现setRequest()的方法;
    2. struts2在调用相应的action的时候会直接询问是否继承了上述接口并实现了方法,若是, 便调用该方法为action注入相应的元素。

    模块包含

    直接在struts.xml中使用include,就可以将其他的struts文件**.xml
    直接引用进来,(相当于直接粘贴到此处)属于struts.xml文件的内容。
    模块包含.png

    默认action

    若找不到相应的action,就默认访问这个action
    默认action.png

    Result结果集

    结果集类型

    image.png

    全局result

    概念:同一个package下的action 可以共用。
    全局result.png

    也可以使用extends继承另一个packaga的结果集。默认继承"struts-default"

    动态结果集

    ${} : 用于在配置文件里,向值栈(value stack)里边取值。同时根据取得的结果动态指定不同的result
    配置文件
    动态结果集配置文件.png
    action文件
    动态结果集action文件.png

    带参数的结果集

    一次request只有一个值栈,使用forward进行跳转的action共用一个值栈,因为他们共用一个request。所以不用传递参数。
    但是redirect需要,因为redirect会发起新的request,建立新的值栈。
    带参数的结果集.png

    2018-08-14 至此这一部分结束!

  • 相关阅读:
    红线行动开发文档
    团队作业1
    第二次作业:安装VS2015和使用自动测试管理工具
    简单介绍VS2015自动测试工具
    软件工程作业(一)
    三带一队 实验十 团队作业6:团队项目用户验收&BETA冲刺
    《三带一队》【Beta】Scrum meeting 4
    《三带一队》【Beta】Scrum meeting 3
    《三带一队》【Beta】Scrum meeting 2
    《三带一队》【Beta】Scrum meeting 1
  • 原文地址:https://www.cnblogs.com/nce4/p/9469117.html
Copyright © 2011-2022 走看看