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的方法。写好这个类就可以按照上面的配置步骤进行配置,就可以使用了。

Struts框架的核心业务的更多相关文章

  1. Struts框架

    Struts是最早的Java开源框架之一,它是MVC设计模式的一个优秀实现. Struts定义了通用的Controller(控制器),通过配置文件(通常是 Struts -config.xml) Ec ...

  2. 使用Struts框架,实现用户登陆功能

    前言:本篇文章是本人这周学习的一个小结,在自我总结的同时,希望也能够给其他同学带来一点帮助.本文主要知识是参照书本上的知识点以及网上其他博客文章,在上机操练后的所得,具体源码主要来自http://bl ...

  3. Struts框架2ActionError类 内部资料 请勿转载 谢谢合作

    ActionError类从不独立进行错误处理,它们总是被存储在ActionErrors对象中.ActionErrors对象保存ActionError类的集合以及它们特定的属性值,我们可以使用自己定义的 ...

  4. Struts框架 内部资料 请勿转载 谢谢合作

    Struts框架 struts框架具有组件的模块化,灵活性和重用性的优点,同时简化了基于MVC的web应用程序的开发. 本章详细讨论struts架构.我们将看到struts是如何清晰地区分控制,事务逻 ...

  5. Eclipse/JavaWeb (一)三大框架之struts框架 持续更新中...

    最近主要把javaweb的三大框架过一遍. (一)发展历史 传统的Java Web应用程序是采用JSP+Servlet+Javabean来实现的,这种模式实现了最基本的MVC分层,使得程序分为几层,有 ...

  6. Struts框架——(三)动态ActionForm

    一.DynaActionForm的引入意义 使用ActionForm把表单数据单独封装起来,而且提供了自动的数据验证,简化了代码的编写,给我们带来了极大的方便. 但是,ActionForm也存在一些明 ...

  7. 启动tomcat后struts框架报异常严重: Exception starting filter struts2 Unable to load configuration.

    启动tomcat后struts框架报异常严重: Exception starting filter struts2 Unable to load configuration. 出现此异常是因为,str ...

  8. struts框架学习过程中的问题

    1,错误: java.lang.NullPointerException: Module 'null' not found.错误原因,struts运行需要的.jar文件拷贝不足,应该把它们加入到cla ...

  9. 通常Struts框架会自动地从action mapping中创建action对象

    开发者不必在Spring中去注册action,尽管可以这么去做,通常Struts框架会自动地从action mapping中创建action对象 struts2-spring-plugin-x-x-x ...

随机推荐

  1. ABP教程-打造一个《电话簿项目》-目录-MPA版本-基于ABP1.13版本

    此系列文章会进行不定期的更新,应该会有6章左右. 感兴趣的朋友可以跟着看看,本教程适合已经看过ABP的文档但是又无从下手的小伙伴们. 初衷: 发布系列教程的原因是发现ABP在园子火了很久,但是发现还是 ...

  2. Java 堆内存与栈内存异同(Java Heap Memory vs Stack Memory Difference)

    --reference Java Heap Memory vs Stack Memory Difference 在数据结构中,堆和栈可以说是两种最基础的数据结构,而Java中的栈内存空间和堆内存空间有 ...

  3. 搭建QQ聊天通信的程序:(1)基于 networkcomms.net 创建一个WPF聊天客户端服务器应用程序 (1)

    搭建QQ聊天通信的程序:(1)基于 networkcomms.net 创建一个WPF聊天客户端服务器应用程序 原文地址(英文):http://www.networkcomms.net/creating ...

  4. OpenDigg前端开源项目周报1219

    由OpenDigg 出品的前端开源项目周报第二期来啦.我们的前端开源周报集合了OpenDigg一周来新收录的优质的前端开发方面的开源项目,方便前端开发人员便捷的找到自己需要的项目工具等.react-f ...

  5. 手动导入swift三方danielgindi/Charts到OC工程中教程

    1.到github网址上下载zip压缩包https://github.com/danielgindi/Charts 2.然后将解压后的文件夹整个拖到自己的工程文件夹下(很多教程只让拖xcodeproj ...

  6. 完美解决CodeSmith无法获取MySQL表及列Description说明注释的方案

    问题描述: CodeSmith是现在比较实用的代码生成器,但是我们发现一个问题: 使用CodeSmith编写MySQL模板的时候,会发现一个问题:MySQL数据表中的列说明获取不到,也就是column ...

  7. linux压力测试工具stress

    最近给PASS平台添加autoscaling的功能,根据服务器的负载情况autoscaling,为了测试这项功能用到了stress这个压力测试工具,这个工具相当好用了.具体安装方式就不说了.记录下这个 ...

  8. (转) [it-ebooks]电子书列表

    [it-ebooks]电子书列表   [2014]: Learning Objective-C by Developing iPhone Games || Leverage Xcode and Obj ...

  9. 更有效率的使用Visual Studio(二)

    没想到上一篇文章有这么多人喜欢,多谢大家支持.继续- 很多比较通用的快捷键的默认设置其实是有一些缩写在里面的,这个估计也是MS帮助我们记忆.比如说注释代码的快捷键是Ctrl + E + C,我们如果知 ...

  10. Visual Studio 宏的高级用法

    因为自 Visual Studio 2012 开始,微软已经取消了对宏的支持,所以本篇文章所述内容只适用于 Visual Studio 2010 或更早期版本的 VS. 在上一篇中,我已经介绍了如何编 ...