框架学习之Struts2 第三节 请求参数的接收和自定义类型转换器

1. 接受请求参数

这里的参数可以是get方式提交的,也可以是post方式提交的

有两种方式:第一种方式,采用基本类型接收请求参数

原理是struts2采用了反射技术给action类的属性赋值

第二种方式,采用复合类型接收参数。

其内部是采用了反射技术,首先如果相应的类的对象为null,就调用默认的无参的构造方法生成一个实例,然后给实例的属性赋值

 12_1

测试一:以get方式提交

在上节测试代码中的strutspackage.xml的名为yinger的package中添加以下的action

<action name="requestPara" class="com.yinger.HelloWorld"
method
="requestPara">
<result name="requestPara">/requestPara.jsp</result>
</action>
Person.java


package com.beans;

public class Person {

private String id;
private String name;

public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}

}
在HelloWorld中添加以下内容:

private String requestPara;
private Person onePerson;

public String plaintext(){
message
= "HelloWorld.plaintext";
return "plaintext";
}

public String requestPara(){
message
= "HelloWorld.requestPara";
return "requestPara";
}

public String getRequestPara() {
return requestPara;
}
添加 requestPara.jsp

<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'requestPara.jsp' starting page</title>
</head>

<body>
requestPara.jsp
<br>
requestPara:${requestPara }
<br>
person.id:${onePerson.id }
<br>
person.name:${onePerson.name }
<br>
</body>
</html>

测试结果:

1.http://localhost:8080/struts2test/yinger/requestPara?requestPara=yinger

11

2.http://localhost:8080/struts2test/yinger/requestPara?onePerson.id=2

12

3.http://localhost:8080/struts2test/yinger/requestPara?onePerson.name=yinger

13

4.http://localhost:8080/struts2test/yinger/requestPara?onePerson.id=2&onePerson.name=yinger

14

  

测试二:使用post方式

Person.java添加以下内容

private Date birthday;

public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
  
修改 index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<%@ taglib uri="/struts-tags" prefix="s"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'index.jsp' starting page</title>
</head>

<body>
<s:form method="post" action="requestPost" namespace="/yinger">
name:
<br><input name="onePerson.name" /><br>
id:
<br><input name="onePerson.id" /><br>

<input type="submit" name="submit" value="提交" /><br>
</s:form>
</body>
</html>
同样的,在刚才的action下面添加新的action

<action name="requestPost" class="com.yinger.HelloWorld"
method
="requestPost">
<result name="requestPost">/requestPara.jsp</result>
</action>

   

测试结果:

编辑,点提交

 

结果视图:

2. 解决struts2.1.6 中接收中文请求的参数乱码的问题的方法

没有测试过!

这里有一个很好的解释和代码展示:http://www.iteye.com/topic/483158

以前学习JavaWeb时还学过一个方法:修改 Tomcat的配置文件 server.xml 

    <Connector port="8080" protocol="HTTP/1.1"  connectionTimeout="20000" 

      redirectPort="8443" URIEncoding="UTF-8" />  

在这里设置了编码方式就可以防止请求参数中文乱码的问题,但是有一个缺点就是它会作用于所有的web应用,修改了这个配置就会影响其他的应用

如果都是同一种编码方式那也没有问题,呵呵呵呵

12_2

3. struts2提供了两种类型转换器

①全局类型转换器

②局部类型转换器

13_1

局部类型转换器:ActionName-conversion.properties

13_2

导入包时: 两者选择哪个都可以,视频老师说是测试过了,我是用的上者,注意他们要重写的方法是不同的,并且建议你使用上者,我两个都试了试,呵呵

17

全局类型转换器:xwork-conversion.properties

14_1

测试代码:

修改index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'reuqestPara.jsp' starting page</title>
</head>

<body>
requestPara.jsp
<br>
time:{time}
<br>
person.id:${onePerson.id }
<br>
person.name:${onePerson.name }
<br>
person.birthday:${onePerson.birthday }
<br>
</body>
</html>  
类型转换类


package com.convertion;

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

import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter;

public class DateConvertion extends DefaultTypeConverter{

//这个convertValue是双向的,既有从页面得到请求的参数,转换成后台的的对应的类型
//也有从后台将处理的结果显示在前台,之前进行另外一次转型,转成String
@SuppressWarnings("rawtypes")
@Override
public Object convertValue(Map<String, Object> context, Object value,
Class toType) {
SimpleDateFormat sdf
=new SimpleDateFormat("yyyyMMdd");
try {
if(toType==Date.class){//String-->Date
String[] paras=(String[])value;//value=Request.getParameterValues()
return sdf.parse(paras[0]);
}
else if(toType==String.class){//Date-->String
Date date=(Date)value;
return sdf.format(date);
}
}
catch (Exception e) {
e.printStackTrace();
}
return null;
}

}
  
在com.yinger 包下面添加 属性文件

文件名:HelloWorld-conversion.properties

文件内容:
onePerson.birthday=com.convertion.DateConvertion
time=com.convertion.DateConvertion

   

测试结果:

1. 首先不添加那个属性文件,测试index.jsp,正确解析了Date   birthday

1819

2.测试index.jsp,格式为 yyyyMMdd 的解析错误

20

21

3.测试requestPara这个action,格式正确解析正确  time

22

4.格式为 yyyyMMdd的解析错误  time

23

5. 添加了 properties 这件之后! time,正确

24

测试 index.jsp  解析正确

2526

  

4. 访问和添加 request / session / application 属性

可以 通过 ActionContext 来访问,得到的不是对象,而是一个相应的map

15_1

获取 HttpServletRequest  /  HttpServletSession  / HttpServletResponse / ServletContext 对象

有两种方法:第一种方法,通过 ServletActionContext 直接获取

它可以得到对应的各种对象,但是大多数时候并不需要得到对应的对象,因为多数时候都只是set和get对应的对象的属性值

第二种方法,实现指定的接口,具体的什么时候执行类中的方法是由struts框架来决定的,它会在运行时注入相关的信息

15_2

测试代码:

HelloWorld中添加方法

public String scope() {
ActionContext ctx
= ActionContext.getContext();
ctx.getApplication().put(
"app", "application范围");// 往ServletContext里放入app
ctx.getSession().put("ses", "session范围");// 往session里放入ses
ctx.put("req", "request范围");// 往request里放入req
return "scope";

}
  
添加新的action

<action name="scope" class="com.yinger.HelloWorld"
method
="scope">
<result name="scope">/scope.jsp</result>
</action>  
新的jsp:scope.jsp

<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'scope.jsp' starting page</title>
</head>

<body>
application:${applicationScope.app }
<br>
session:${sessionScope.ses }
<br>
request:${requestScope.req }
<br>
</body>
</html>

  

测试结果:

原文地址:https://www.cnblogs.com/yinger/p/2116977.html