Struts框架的核心业务

Struts的核心业务

Struts核心业务有很多,这里主要介绍了比较简单一些的:
请求数据的处理,和数据自动封装,类型自动转换

1.Struts中数据处理

1.1.方式1:直接过去servletapi

核心类:ServletActionContext提供的静态方法

/**
 *
 * 数据处理方式1:
 */
public class dataAction extends ActionSupport{
    public String execute() throws Exception {
        //1.请求数据处理
        //2.调用Service处理业务逻辑,拿到结果数据
        //3.保存数据到域中
        //Struts中对数据操作,方式1:直接拿到ServletApi,执行操作
        HttpServletRequest request = ServletActionContext.getRequest();
        HttpSession session = request.getSession();
        ServletContext application = ServletActionContext.getServletContext();
        //操作
        request.setAttribute("request_data","request_data_value");
        session.setAttribute("session_data","session_data_value");
        application.setAttribute("application_data","application_data_value");

        return SUCCESS;
    }
}

1.2.方式2:通过ActionContext获取

可以通过ActionContext获取不同(代表request/session/application)的map


/**
 *
 * 数据处理方式2:
 */
public class dataAction extends ActionSupport{
    public String execute() throws Exception {
        //1.请求数据处理
        //2.调用Service处理业务逻辑,拿到结果数据
        //3.保存数据到域中

        //下面的方法不用导入servlet的包,推荐使用,但是这种方式只能保存,如果设计其他操作还是需要用上面的方法
        //Struts中对数据的操作,方式2:通过ActionContext类
        ActionContext ac = ActionContext.getContext();
        //得到Struts对HttpServletRequest对象进行了封装,封装为一个map
        //拿到表示request对象的map
        Map request = ac.getContextMap();
        //拿到表示Session对象的map
        Map session = ac.getSession();
        //拿到表示servlectContext对象的map
        Map application = ac.getApplication();

        //数据
        request.put("request_data","request_data_value");
        session.put("session_data","session_data_value");
        application.put("application_data","application_data_value");


        return SUCCESS;
    }
}

1.3.方式3:实现接口的方式(RequestAware/SessionAware/ApplicationAware)**


/**
 * 数据处理方式3:
 */
public class dataAction2 extends ActionSupport implements RequestAware,SessionAware,ApplicationAware {
    private Map<String,Object> request;
    private Map<String,Object> session;
    private Map<String,Object> application;


    //struts运行时候,会把代表request的map对象注入
    public void setRequest(Map<String, Object> request) {
        this.request=request;

    }
    public void setSession(Map<String, Object> session) {
        this.session=session;
    }
    public void setApplication(Map<String, Object> application) {
        this.application = application;
    }
    @Override
    public String execute() throws Exception {
        //数据
        request.put("request_data","request_data_value");
        session.put("session_data","session_data_value");
        application.put("application_data","application_data_value");


        return SUCCESS;
    }

}

三种方式的区别:
第一种方式需要再导入servlet,依赖性较大,只有还会使用到request等类型其他方式的时候才会用
第二种比较常用,推荐使用这种
第三种是需要写很多的方法,只有在方法比较多的时候,才会使用,即大型的项目中才会考虑使用。但是一般都是使用第二种

2.请求数据自动封装

2.1.基本思想和简介

在Struts框架之前,表单内的数据参数会被Servlet接收,然后存入实体bean类里面。那么有了Struts框架之后,这个操作就由框架来自动完成了。
表单提交的参数保存分为基本类型的和对象属性的:
如果是基本类型和Date类型的,只需要对该类型再写一个set××()方法就可以,可以不写get××()方法。
如果是对象类型,然后把数据保存到对象的属性中,就需要在bean中写set**()和get××()方法,然后在action中也需要写set××()和get××(),但是不用new方法来创建对象,直接定义一个对象就可以了(private User user;)

实现原理是通过参数拦截器来实现的:
<interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>

2.2.基本数据类型和Date

jsp表单页面


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>index</title>
  </head>
  <body>
  <form action="${pageContext.request.contextPath}/login1" method="post">
    用户名:<input type="text" name="name"> <br/>
    密码:<input type="text" name="pwd"> <br/>
    年龄:<input type="text" name="age"> <br/>
    生日:<input type="text" name="birth"> <br/>

    <input type="submit" value="注册">
  </form>
  </body>
</html>

action处理页面

package d_action;



import com.opensymphony.xwork2.ActionSupport;

import java.util.Date;

/**
 *Struts核心业务,请求数据自动封装,以及类型转换
 */
public class UserAction extends ActionSupport{

    //封装请求数据
    private String name; //必须给set,get可以不用给
    private String pwd;
    private int age;
    private Date birth;

    public void setName(String name) {
        this.name = name;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void setBirth(Date birth) {
        this.birth = birth;
    }


    //处理注册请求
    public String register(){
        System.out.println(name);
        System.out.println(pwd);
        System.out.println(age);
        System.out.println(birth);
        return "success";
    }
}

2.3.自动转换对象属性

jsp页面


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>index</title>
  </head>
  <body>
  <form action="${pageContext.request.contextPath}/login1" method="post">
    用户名:<input type="text" name="user.name"> <br/>
    密码:<input type="text" name="user.pwd"> <br/>
    年龄:<input type="text" name="user.age"> <br/>
    生日:<input type="text" name="user.birth"> <br/>

    <input type="submit" value="注册">
  </form>
  </body>
</html>

action类:

package d_action;



import com.opensymphony.xwork2.ActionSupport;


/**
 *Struts核心业务,请求数据自动封装,对象的属性
 */
public class UserAction extends ActionSupport{

    //封装请求数据
    private User user;  //对象类型一定要给get方法


    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    //处理注册请求
    public String register(){
        System.out.println(user.getName());
        System.out.println(user.getPwd());
        System.out.println(user.getAge());
        System.out.println(user.getBirth());
        return "success";
    }
}

调用的User实体:

package d_action;

import java.util.Date;


public class User {
    private String name; //必须给set,get可以不用给
    private String pwd;
    private int age;
    private Date birth;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Date getBirth() {
        return birth;
    }

    public void setBirth(Date birth) {
        this.birth = birth;
    }
}

3.类型转换

3.1.为什么需要类型转换

Struts中jsp提交的数据是String,代码中使用或再显示,就需要转换为对应的格式,Struts会自动转换为action中属性的类型,对于基本数据类型以及日期类型会自动转换。
日期类型只支持yyyy-MM-dd格式。
如果需要指定格式,需要自定义类型转换器,自定义转换器分为两种:

  • 局域类型转换器
  • 全局类型转换器

Struts转换器API
|- TypeConverter :转换器接口

|- DefaultTypeConverter :默认类型转换器类

|- StrutsTypeConverter :用户编写的转换器类,继承此类即可

3.2.局部转换器开发步骤

1.自定义转换器继承StrutsTypeConverter
2.重写converFormString和converToString方法
3.注册转换器:

  • 3.1.在Action所在包中建立Action名-conversion.properties
  • 3.2.在3.1文件中添加以下数据:
  • 需要转的字段名=转换器类的项目内路径名,如:`user.birth=utils.MyConverter‘

总结:局部转换器不能其他人的Action使用

3.3.全局类型转换器开发步骤

1.自定义转换器继承StrutsTypeConverter
2.重写converFormString和converToString方法
3.注册转换器:

  • 3.1.下项目src目录下建立以下固定文件:xwork-conversion.properties
  • 3.2.在3.1文件中添加以下数据:
  • 需要转的类的类型=转换器类的项目内路径名,如:`java.util.Date=utils.MyConverter‘

总结:
该拦截器负责对错误信息进行拦截器:<interceptor name="conversionError“ class="org.apache.struts2.interceptor.StrutsConversionErrorInterceptor"/>

以上两种方法的自定义类型转换的转换器代码为:

package utils;

import org.apache.struts2.util.StrutsTypeConverter;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;

/**
 * 自定义类型转换器类
 */
public class MyConverter extends StrutsTypeConverter {


    /**
     * 把String转换为指定的类型【String to Date】
     * @param context : 当前上下文环境
     * @param values : jsp表单提交的字符串的值
     * @param toClass : 要转换为的目标类型
     * @return 返回转换好的目标类型数值
     */
    public Object convertFromString(Map context, String[] values, Class toClass) {
        try {
            //判断:内容不能为空
            if (values==null || values.length==0){
                return null;
            }
            //判断:类型必须为Date
            if (Date.class != toClass){
                return null;
            }
            //转换
            SimpleDateFormat sdf = new SimpleDateFormat("yyyMMdd");
            return sdf.parse(values[0]);
        } catch (ParseException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

    public String convertToString(Map context, Object o) {
        return null;
    }
}

此代码中仍有不足,没有写convertToString的方法。写好这个类就可以按照上面的配置步骤进行配置,就可以使用了。

原文地址:https://www.cnblogs.com/cenyu/p/6219944.html