1. 接受请求参数
这里的参数可以是get方式提交的,也可以是post方式提交的
有两种方式:第一种方式,采用基本类型接收请求参数
原理是struts2采用了反射技术给action类的属性赋值
第二种方式,采用复合类型接收参数。
其内部是采用了反射技术,首先如果相应的类的对象为null,就调用默认的无参的构造方法生成一个实例,然后给实例的属性赋值
测试一:以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
2.http://localhost:8080/struts2test/yinger/requestPara?onePerson.id=2
3.http://localhost:8080/struts2test/yinger/requestPara?onePerson.name=yinger
4.http://localhost:8080/struts2test/yinger/requestPara?onePerson.id=2&onePerson.name=yinger
测试二:使用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应用,修改了这个配置就会影响其他的应用
如果都是同一种编码方式那也没有问题,呵呵呵呵
3. struts2提供了两种类型转换器
①全局类型转换器
②局部类型转换器
局部类型转换器:ActionName-conversion.properties
导入包时: 两者选择哪个都可以,视频老师说是测试过了,我是用的上者,注意他们要重写的方法是不同的,并且建议你使用上者,我两个都试了试,呵呵
全局类型转换器:xwork-conversion.properties
测试代码:
修改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
2.测试index.jsp,格式为 yyyyMMdd 的解析错误
3.测试requestPara这个action,格式正确解析正确 time
4.格式为 yyyyMMdd的解析错误 time
5. 添加了 properties 这件之后! time,正确
测试 index.jsp 解析正确
4. 访问和添加 request / session / application 属性
可以 通过 ActionContext 来访问,得到的不是对象,而是一个相应的map
获取 HttpServletRequest / HttpServletSession / HttpServletResponse / ServletContext 对象
有两种方法:第一种方法,通过 ServletActionContext 直接获取
它可以得到对应的各种对象,但是大多数时候并不需要得到对应的对象,因为多数时候都只是set和get对应的对象的属性值
第二种方法,实现指定的接口,具体的什么时候执行类中的方法是由struts框架来决定的,它会在运行时注入相关的信息
测试代码:
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>
测试结果: