Struts2系列(二)Action

一.Action是Struts2的核心,所有用户请求都需要使用Action处理并返回数据。

二.Action测试代码

直接上代码,具体解释见代码注释
代码演示内容:创建Action,Action默认值,Action获取参数

必不可少之主配置文件struts.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- 
1.struts配置文件
新建文件名称必须为struts.xml放在src目录下
2.关于约束导入
导包后在struts2-core-2.3.24.jar/struts-2.3.dtd找到约束文件
将文件中的内容复制到新建文件struts-2.3.dtd中
导入到开发环境,复制约束声明到struts.xml
如果正确提示标签,则证明导入成功
 -->
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
    <struts>
    <!-- package元素详解
    package:将action配置封装,可以在package中配置多个action。
    name:名称,随便起名。不能与其他包名重复。
    namespace:给action访问路径中定义一个命名空间。
    extends(必选):继承一个指定的包。struts-default是默认提供的包。
    由struts2-core-2.3.24.jar/struts-default.xml提供
    abstract:包是否为抽象的,标识性属性。标识不能独立运行,用于继承。
     -->
    <package name="hello" namespace="/hello" extends="struts-default">
        <!-- action元素详解
        name:action的访问资源名称。
        class:action的完整类名。
        method:指定调用action类中那个方法处理请求。
             -->
    <action name="helloaction" class="cjx.action.HelloAction" method="hello">
        <!-- result元素详解
        name:标识结果处理的名称与action方法的返回值对应。
        type:指定调用哪一个result类来处理结果,默认使用转发(dispatcher)。
                    其他的还有重定向(redirect),链(转发到action)(chain),重定向到action(redirectAction)
        struts2-core-2.3.24.jar/struts-default.xml内置了处理方式
        标签体:填写页面的相对路径。
         -->
         <!-- http://localhost:8080/struts2/hello/helloaction -->
        <result name="success" >/hello.jsp</result>
    </action>
    </package>
    <!-- struts常量配置
            struts2-core-2.3.24.jar/org.apache.struts2/default.properties描述了有哪些常量
            关于struts.i18n.encoding的配置
            1.可以新建一个properties配置文件,将需要的常量复制到文件中(中间加载,会覆盖之前的)
            2.在web.xml配置如下属性(最后加载,会覆盖之前的)
              <context-param>
                <param-name>struts.i18n.encoding</param-name>
                <param-value>UTF-8</param-value>
              </context-param>
            3.可以使用如下constant 属性配置常量(常用)(最先加载)
         -->
    <!-- i18n:国际化(Internationalization:i和n中间有18个字母). 解决post乱码-->
    <constant name="struts.i18n.encoding" value="UTF-8"></constant>
    <!-- 指定访问action的后缀名,默认值action和空,可以修改,此处未改-->
    <constant name="struts.action.extension" value="action,,"></constant>
    <!-- 指定Struts2是否以开发模式运行
    可以热加载主配置(不需重启即可生效)
    提供更多的错误信息输出,但是会消耗更多资源
     -->
    <constant name="struts.devMode" value="true"></constant>

    <!-- 引入其他配置文件 -->
    <include file="cjx/action/UserActionStruts.xml"></include>
    <include file="cjx/action/DefaultActionStruts.xml"></include>
    <include file="cjx/action/ParamActionStruts.xml"></include>
    </struts>

必不可少之web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>struts2</display-name>
  <!-- struts2是基于过滤器(拦截器)的框架,只有配置了过滤器才能启用struts2框架 -->
  <filter>
  <filter-name>struts2</filter-name>
  <!-- struts2核心过滤器,必须配置这个。Ctrl+Shift+T查找StrutsPrepareAndExecuteFilter,复制完整类名 -->
  <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
  <filter-mapping>
  <filter-name>struts2</filter-name>
  <!-- 配置struts2要处理项目中的那些请求。/*表示所有请求 -->
  <url-pattern>/*</url-pattern>
  </filter-mapping>

  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
</web-app>

HelloAction.java

//import com.opensymphony.xwork2.Action;
//import com.opensymphony.xwork2.ActionSupport;

public class HelloAction {//Struts2的第一个测试
    public String hello(){
        /*搭建struts2框架
         * 1.导包
         * ···\struts-2.3.24\apps\struts2-blank.war是一个空白项目
         * 把空白项目中的包导入即可
         * 2.书写Action类
         * 3.书写src/struts.xml
         * 4.将struts2核心过滤器配置到web.xml
         * 5.测试
         */
        System.out.println("Hello World!You get Struts2!");
        return "success";
    }

}

/*Action类规范
 * 方式1:创建一个类,可以是POJO(不继承父类,不实现接口的类),需要一个公共的无参构造方法和Action方法。
 * Action方法要求:
     * 方法权限修饰符为public
     * 返回一个字符串,指示下一个页面的Result
     * 方法没有参数
 * public String xxx() throws  xxx{
 * return null;
 * }
 * 好处:代码侵入性低(但是使用servlet需要实现它的接口)

 * 方式2:实现一个action接口
 * 里面有execute方法,提供action方法的规范.
 * Action接口预置了一些字符串.可以在返回结果时使用.
public class AboutAction implements Action{
    @Override
    public String execute() throws Exception {
        // TODO Auto-generated method stub
        return null;
    }
}

 *方式3:继承ActionSupport类
 *帮我们实现了 Validateable, ValidationAware, TextProvider, LocaleProvider接口 .
 *如果我们需要用到这些接口的实现时,不需要自己来实现了.
class AboutAction extends ActionSupport{
}
 */

DefaultAction.java

public class DefaultAction extends ActionSupport {//Struts2默认值测试
    public String execute(){
        System.out.println("Struts2默认值测试");
        return "success";
    }
}

DefaultActionStruts.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
    <struts>    
    <package name="default" namespace="/default" extends="struts-default">      
    <!-- 如果找不到包下的action,会使用默认配置的action -->
    <default-action-ref name="default"></default-action-ref>
    <!-- 默认值
    action  method属性:execute
    result  name属性:success
    result type属性:dispatcher  (转发)
    action class属性:不写class属性会使用Struts2的默认值,也不会调用方法
    在文件struts2-core-2.3.24.jar/struts-default.xml最下面
    <default-class-ref class="com.opensymphony.xwork2.ActionSupport" />
     -->
    <action name="default" class="cjx.action.DefaultAction" >
    <result>/hello.jsp</result> 
    </action>
    </package>  
    </struts>

hello.jsp

   Hello World!This  is Struts2!<br>

UserAction.java

public class UserAction {//动态方法调用演示
    public String add(){
        System.out.println("添加用户!");
        return "success";
    }
    public String delete(){
        System.out.println("删除用户!");
        return "success";
    }
    public String update(){
        System.out.println("修改用户!");
        return "success";
    }
    public String find(){
        System.out.println("查找用户!");
        return "success";
    }
}

UserActionStruts.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
    <struts>
    <!-- 动态方法调用:方法一。不配置method,开启动态方法常量
    在地址栏输入路径+!+方法名,可以调用方法,例如调用add方法
    http://localhost:8080/struts2/user/useraction!add 
    此方法不利于SEO优化(搜索引擎查找)
    -->
    <!-- 开启动态方法配置的常量,默认关闭 -->
    <!-- 
    <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
    -->
    <!-- 
    <package name="dynamic" namespace="/user" extends="struts-default">
    <action name="useraction" class="cjx.action.UserAction" >
    <result name="success"></result>
    </action>
    </package>
     -->
    <!-- 动态方法调用:方法二。通配符*
    action name="useraction*"
    后面加个*(星号)
    method="{1}"
    {1}取出*输入的内容,{2}取出第二个*输入的内容
    -->
    <package name="dynamic" namespace="/user" extends="struts-default">
    <action name="useraction*" class="cjx.action.UserAction" 
    method="{1}">
    <result name="success"></result>
    </action>
    </package>
    </struts>

ParamActionStruts.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
    <struts>

<package name="param" namespace="/param" extends="struts-default">
    <action  name="paramaction" class="cjx.action.ParamAction" >
    <result name="success">/form.jsp</result>
    </action>
    <action name="paramaction2" class="cjx.action.ParamAction2" method="exe">
    <result name="success">/form.jsp</result>
    </action>
        <action name="paramaction3" class="cjx.action.ParamAction3" method="cute">
    <result name="success">/form.jsp</result>
    </action>
    </package>
    </struts>

form.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <body>
  <div style="float: left;">  
<form action="${pageContext.request.contextPath}/param/paramaction" method="post">
方式一:属性驱动和模型驱动<br>
post-name:<input type="text" name="name"><br>
post-age:<input type="text" name="age"><br>
post-date:<input type="text" name="date"><br>
<input type="submit" value="提交">
</form><br>

<form action="${pageContext.request.contextPath}/param/paramaction" method="get">
方式一:属性驱动和模型驱动<br>
get-name:<input type="text" name="name"><br>
get-age:<input type="text" name="age"><br>
get-date:<input type="text" name="date"><br>
<input type="submit" value="提交">
</form><br>

<form action="${pageContext.request.contextPath}/param/paramaction" method="post">
方式二:对象驱动(注意name值)<br>
name:<input type="text" name="user.name"><br>
age:<input type="text" name="user.age"><br>
date:<input type="text" name="user.date"><br>
<input type="submit" value="提交">
</form><br>

<form action="${pageContext.request.contextPath}/param/paramaction2" method="post">
方式三:模型驱动<br>
name:<input type="text" name="name"><br>
age:<input type="text" name="age"><br>
date:<input type="text" name="date"><br>
<input type="submit" value="提交">
</form><br>
</div>

<div style="float: inherit;">  
<form action="${pageContext.request.contextPath}/param/paramaction3" method="post">
list集合类型封装<br>
list:<input type="text" name="list"><br>
list:<input type="text" name="list[2]"><br>
list:<input type="text" name="list[4]"><br>
list*:<input type="text" name="list[2]"><br>
list*:<input type="text" name="list[4]"><br>
<br>map集合类型封装<br>
map:<input type="text" name="map['one']"><br>
map:<input type="text" name="map['two']"><br>
map:<input type="text" name="map['three']"><br>
map*:<input type="text" name="map['one']"><br>
map*:<input type="text" name="map['one']"><br>
<input type="submit" value="提交">
</form><br>
</div>
</body>
</html>

ParamAction.java

//如何获得参数
public class ParamAction extends ActionSupport {
    //方式一:属性驱动
    //准备与参数名称相同的属性和get,set方法
    //每次请求都会创建action对象(原因)
    //自动类型转换只能转换基本数据类型及其包装类和date类型
    private String name;
    private Integer age;
    //date类型只能转换yyyy-MM-dd类型字符串
    private Date date;
    //方式二:对象驱动
    //准备与参数名称相同的实体类和属性和get,set方法
    private User user;


    /*演示代码*/
    public ParamAction() {//构造参数
        System.out.println("Action创建了");
    }
    public String execute() throws Exception {
        System.out.println("方式一:name参数:"+name+";age参数:"+age+";date参数:"+date);
        System.out.println("方式二:"+user);
        return SUCCESS;
    }

    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public Date getDate() {
        return date;
    }
    public void setDate(Date date) {
        this.date = date;
    }
}

ParamAction2.java

public class ParamAction2 extends ActionSupport implements ModelDriven<User>{
        //方式三:模型驱动
        //准备与参数名称相同的属性但没有get,set方法
        //实现接口ModelDriven<T>,T为要封装的对象,实现未实现方法
        private User modeluser=new User();
        @Override
        public User getModel() {//实现接口ModelDriven<T>未实现方法
            //只需要把要封装的对象return 即可
            //但是要注意:属性必须new出要封装的对象,否则会返回null
            return modeluser;
        }
        /*演示代码*/
        public ParamAction2() {//构造参数
            System.out.println("Action创建了");
        }
        public String exe() throws Exception {

            System.out.println("方式三:"+modeluser);
            return SUCCESS;
        }
}

ParamAction3.java

public class ParamAction3 {//集合类型封装

    private List<String> list;
    private Map<String, String>map;
    public String cute() throws Exception {
        System.out.println("list:"+list);
        System.out.println("map:"+map);
        return "success";
    }
    public List<String> getList() {
        return list;
    }
    public void setList(List<String> list) {
        this.list = list;
    }
    public Map<String, String> getMap() {
        return map;
    }
    public void setMap(Map<String, String> map) {
        this.map = map;
    }   
}
  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值