Struts2核心业务
1、请求数据自动封装
2、类型转换
3、Struts中数据处理
4、文件上传
1、Action开发与访问
1.1、Struts2 Action的开发
方式一:继承ActionSupport
如果使用Struts的数据校验功能必须实现此类
方式二:实现Action接口
方式三:写一个普通类,不实现接口和继承类
1.2、struts通配符
Action类
public class Action extends ActionSupport{
private User user;
public void setUser(User user) {
this.user = user;
}
public User getUser() {
return user;
}
public String login(){
System.out.println(user.getName());
System.out.println(user.getAge());
System.out.println(user.getPwd());
return "login";
}
public String name(){
System.out.println(user.getName());
return "name";
}
public String age(){
System.out.println(user.getAge());
return "age";
}
通配符配置struts.xml
<!-- 通配符的使用 -->
<action name="user_*" class="com.wsk.b_action.Action" method="{1}">
<result name="{1}">/index.jsp</result>
</action>
1.3、名称空间
<package name="xxs" extends="struts-default" namespace="/user">
这里的namespace
指定访问的路径,服务器搜索原理:
http://localhost:8080/struts/user/a/b/login.action
step1: 访问localhost 服务器ip
step2: 访问服务器端口 8080
step3: 访问项目 项目名
step4: 访问指定的名称空间 /user/a/b 先看这个名称空间是否存在指定的资源login.action,有就访问到,没有继续向下
step5: /user/a 在此名称空间下寻找资源
step6: /user
step7: / 如果还没找到就报错
1.4、动态方法调用
调用ActionName!方法名
注意要使用动态方法调用时,要使用常量开启动态方法调用
安全性能差,不建议使用
struts.enable.DynamicMethodInvocation = true
<!-- 动态方法调用:http://localhost:8088/struts2_day526/user!login -->
<action name="user" class="com.wsk.b_action.Action" >
<result name="success">/login.jsp</result>
<result name="login">/login.jsp</result>
<result name="name">/login.jsp</result>
<result name="age">/login.jsp</result>
</action>
1.5、全局跳转视图配置
首先会在action中找相应的返回值,如果没有,就在全局跳转中找
注意:这个全局跳转必须配置在package中第一个标签
<!-- 全局视图配置 -->
<global-results>
<result name="success">/index.jsp</result>
</global-results>
2、Struts2常量
2.1、Struts中访问后缀:
Struts1中默认访问后缀是*.do
Struts2中默认访问后缀是*.action
struts2中默认访问后缀配置文件在struts-core
包中,org.apache.struts2
下default.properties中配置
struts.action.extension=action,,
修改访问后缀,在struts.xml中通过常量配置修改
<!-- 代表了访问后缀为.action 或者 没有后缀
action 表示访问后缀为.action
action,do 表示访问后缀为.action/.do
action,do, 表示访问后缀为.action/.do/没有后缀--!>
<constant name="struts.action.extension" value="action,,"></constant>
2.2、其他的一些常量全局配置
constant.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>
<!-- 一、全局配置 -->
<!-- 0. 请求数据编码 -->
<constant name="struts.i18n.encoding" value="UTF-8"/>
<!-- 1. 修改Struts默认的访问后缀 -->
<constant name="struts.action.extension" value="action,do,"></constant>
<!-- 2. 修改xml自动重新加载 -->
<constant name="struts.configuration.xml.reload" value="true"/>
<!-- 3. 开启动态方法调用 (默认不开启)-->
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
<!-- 4. 修改上传文件的最大大小为30M -->
<constant name="struts.multipart.maxSize" value="31457280"/>
</struts>
struts.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>
<!-- 二、总配置文件:引入其他所有配置文件 -->
<!-- 如果存在同名的action后边覆盖前边 --!>
<include file="constant.xml"></include>
<include file="cn/itcast/a_config/struts.xml"></include>
<include file="cn/itcast/b_config2/config.xml"></include>
<include file="cn/itcast/c_data/data.xml"></include>
<include file="cn/itcast/d_type/type.xml"></include>
<include file="cn/itcast/e_fileupload/upload.xml"></include>
</struts>
3、数据处理
3.1域中存储数据
// 方式一
HttpServletRequest req = ServletActionContext.getRequest();
HttpSession sess = req.getSession();
ServletContext servletContext = ServletActionContext.getServletContext();
// 方式二
ActionContext ac = ActionContext.getContext();
//拿到request的Map
Map<String, Object> request = ac.getContextMap();
// 拿到session对象的Map
Map<String, Object> session = ac.getSession();
// 拿到servletContext对象的Map
Map<String, Object> application = ac.getApplication();
实现方式三:实现接口
action类
public class DataAction extends ActionSupport implements RequestAware, SessionAware, ApplicationAware{
private Map<String, Object> request;
// Struts运行时会把代表request的map对象注入
@Override
public void setRequest(Map<String, Object> request) {
this.request = request;
}
private Map<String,Object> session;
@Override
public void setSession(Map<String, Object> session) {
this.session = session;
}
private Map<String,Object> application;
@Override
public void setApplication(Map<String, Object> application) {
this.application = application;
}
@Override
public String execute() throws Exception {
request.put("request_data", "request_dataAction_requestAware");
session.put("session_data", "session_dataAction_requestAware");
application.put("application_data", "application_dataAction_requestAware");
return this.SUCCESS;
}
}
显示结果页面
<body>
<!-- EL表达式 -->
<!-- 直接从对应的域取数据 -->
${requestScope.request_data }<br/>
${sessionScope.session_data }<br/>
${applicationScope.application_data }<br/>
<!-- 依次从pageContext、request、session、application域中查找、 -->
${request_data }<br/>
${session_data }<br/>
${application_data }<br/>
</body>
3.2请求数据自动封装
一般普通类型和日期类型,param拦截器会实现请求数据的自动封装,注意要实现set方法,如果是对象类型则还需要提供get方法,提交的数据name属性为:对象名.属性名。提交的日期类型默认格式为yyyy-MM-dd
自定义日期类型的格式
step1:自己写一个转换器 (需要继承StrutsTypeConverter)
step2:配置转换器
转换器类(放置位置随意)
|--TypeConverter 类型转换器接口
|------DefaultTypeConverter 实现接口的类
|------------SrutsTypeConverter 继承自上个类,用户编写转换器需要继承此类
转换器类
/**
* 自定义类型转换器类
* @author wsk
*
*/
public class MyConverter extends StrutsTypeConverter{
/**
* 把String转换成指定类型
* @param context 当前上下文环境
* @param values jsp表单提交的字符串的值
* @param toClass 要转换为的目标类型
*/
@Override
public Object convertFromString(Map context, String[] values, Class toClass) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
try {
return sdf.parse(values[0]);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
@Override
public String convertToString(Map context, Object o) {
// TODO Auto-generated method stub
return null;
}
}
配置
局部转换器配置
在要提交的Action包下新建一个配置文件(告诉Struts什么类型应该使用我们自己定义的转换器)
命名规则:ActionName-conversion.properties
内容:date=com.wsk.c_date.MyConverter
DateAction-conversion.properties
date=com.wsk.c_date.MyConverter
全局类型转换器配置
配置文件:在src下新建xwork-conversion.properties
内容:类型=转换器类
例如 :java.util.Date=com.wsk.c_date.MyConverter