一、action開發的幾種方式
1.繼承ActionSupport類
2.實現Action接口
3.不繼承類也不實現任何接口
二、通配符
<!-- 通配符: http://locahost:8080/struts02/user_login -->
<action name="user_*" class="cn.itcast.b_config2.UserAction" method="{1}">
</action>
1.動態方法調用,即不配置action的method屬性,直接通過url的形式傳入方法名,即!方法名,不安全
<!-- 動態方法調用: http://locahost:8080/struts02/user!login
<action name="user" class="cn.itcast.b_config2.UserAction">
<result name="success">/index.jsp</result>
</action>
-->
2.全局跳轉視圖,先去對應的action中尋找,如果沒有再去全局配置中尋找 <!-- 配置全局跳轉視圖 -->
<global-results>
<result name="success">/index.jsp</result>
</global-results>
<!-- 什麼情況不配置class? 即處理的aciton -->
<!-- 答案: 當只是需要跳轉到WEB-INF下資源的時候。 -->
<action name="test2">
<result name="success" type="redirect">/WEB-INF/index.jsp</result>
</action>
<constant name="struts.action.extension" value="action,do,"></constant>
3.其它常量 <!-- 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中對數據操作 HttpServletRequest request = ServletActionContext.getRequest();
HttpSession session = request.getSession();
ServletContext application = ServletActionContext.getServletContext();
// 操作
request.setAttribute("request_data", "request_data1");
session.setAttribute("session_data", "session_data1");
application.setAttribute("application_data", "application_data1");
方式2: 通過ActionContext類(練習使用,業務較少的時候)package cn.itcast.c_data;
import java.util.Map;
import javax.servlet.ServletContext;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
/**
* 數據處理
* @author Jie.Yuan
*
*/
public class DataAction_bak extends ActionSupport{
@Override
public String execute() throws Exception {
// 【推薦:解耦的方式實現對數據的操作】
// Struts中對數據操作,方式2: 通過ActionContext類
ActionContext ac = ActionContext.getContext();
// 得到Struts對HttpServletRequest對象進行了封裝,封裝爲一個map
// 拿到表示request對象的map
Map<String,Object> request = ac.getContextMap();
// 拿到表示session對象的map
Map<String, Object> session = ac.getSession();
// 拿到表示servletContext對象的map
Map<String, Object> application = ac.getApplication();
// 數據
request.put("request_data", "request_data1_actionContext");
session.put("session_data", "session_data1_actionContext");
application.put("application_data", "application_data1_actionContext");
return SUCCESS;
}
}
方式3: 實現接口的方法(適合業務方法比較多的情況,優化的時候)package cn.itcast.c_data;
import java.util.Map;
import org.apache.struts2.interceptor.ApplicationAware;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.SessionAware;
import com.opensymphony.xwork2.ActionSupport;
/**
* 數據處理, 方式3: 實現接口的方法
* @author Jie.Yuan
*
*/
public class DataAction extends ActionSupport implements RequestAware, SessionAware, ApplicationAware{
private Map<String, Object> request;
private Map<String, Object> session;
private Map<String, Object> application;
// struts運行時候,會把代表request的map對象注入
@Override
public void setRequest(Map<String, Object> request) {
this.request = request;
}
// 注入session
@Override
public void setSession(Map<String, Object> session) {
this.session = session;
}
// 注入application
@Override
public void setApplication(Map<String, Object> application) {
this.application = application;
}
@Override
public String execute() throws Exception {
// 數據
request.put("request_data", "request_data1_actionAware");
session.put("session_data", "session_data1_actionAware");
application.put("application_data", "application_data1_actionAware");
return SUCCESS;
}
}
七、請求數據自動封裝package cn.itcast.d_type;
import java.util.Date;
public class User {
// 封裝請求數據
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 getName() {
return name;
}
public String getPwd() {
return pwd;
}
public int getAge() {
return age;
}
public Date getBirth() {
return birth;
}
}
2.開發action,給出get、set方法package cn.itcast.d_type;
import java.util.Date;
/**
* Struts核心業務: 請求數據自動封裝以及類型轉換
* @author Jie.Yuan
*
*/
public class UserAction {
// 對象類型,一定給get方法
private User user;
public void setUser(User user) {
this.user = user;
}
public User getUser() {
return 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";
}
}
3.配置struts.xml文件 <package name="type" namespace="/" extends="struts-default">
<action name="user_*" class="cn.itcast.d_type.UserAction" method="{1}">
<result name="success">/index.jsp</result>
</action>
</package>
4.新建register.jsp頁面 <form action="${pageContext.request.contextPath }/user_register.action" 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>
輸入網站:http://localhost:8080/項目名/register.jsp,輸入測試數據即可(date類型struts默認只支持yyyy-MM-dd類型)八、類型轉換
局部轉換器的開發步驟:
package cn.itcast.d_type;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import org.apache.struts2.util.StrutsTypeConverter;
/**
* 自定義類型轉換器類
*
* @author Jie.Yuan
*
*/
public class MyConverter extends StrutsTypeConverter {
// 新需求: 要求項目中要支持的格式,如: yyyy-MM-dd/yyyyMMdd/yyyy年MM月dd日..
// 先定義項目中支持的轉換的格式
DateFormat[] df = { new SimpleDateFormat("yyyy-MM-dd"),
new SimpleDateFormat("yyyyMMdd"),
new SimpleDateFormat("yyyy年MM月dd日") };
/**
* 把String轉換爲指定的類型 【String To Date】
*
* @param context
* 當前上下文環境
* @param values
* jsp表單提交的字符串的值
* @param toClass
* 要轉換爲的目標類型
*/
@Override
public Object convertFromString(Map context, String[] values, Class toClass) {
// 判斷: 內容不能爲空
if (values == null || values.length == 0) {
return null;
}
// 判斷類型必須爲Date
if (Date.class != toClass) {
return null;
}
// 迭代:轉換失敗繼續下一個格式的轉換; 轉換成功就直接返回
for (int i=0; i<df.length; i++) {
try {
return df[i].parse(values[0]);
} catch (ParseException e) {
continue;
}
}
return null;
}
@Override
public String convertToString(Map context, Object o) {
return null;
}
}
2.配置轉換器類文件xwork-conversion.propertiesjava.util.Date=cn.itcast.d_type.MyConverter