Struts知識點概況(一)

一、action開發的幾種方式

1.繼承ActionSupport類

2.實現Action接口

3.不繼承類也不實現任何接口

二、通配符

1.通配符{1}代表第一個*
<!-- 通配符: 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>
3.不配置class
<!-- 什麼情況不配置class? 即處理的aciton -->
		<!-- 答案: 當只是需要跳轉到WEB-INF下資源的時候。 -->
		 <action name="test2">
		 	<result name="success" type="redirect">/WEB-INF/index.jsp</result>
		 </action>
四、路徑匹配原則


五、Struts常量

1.默認後綴:
struts1默認後綴是.do,struts2默認後綴是.action

2.修改默認的訪問後綴,在下面的配置中,訪問的url可以以action、do或者不寫結尾
<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中對數據操作
方式1: 直接拿到ServletApi, 執行操作
	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;
	}

}
七、請求數據自動封裝
實現原理:參數攔截器
實現方式:Jsp表單數據填充到action中的屬性或對象中的屬性
1.新建實體類並生成get、set方法
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類型)
八、類型轉換
struts對於jsp提交的數據,會自動轉換成action中屬性的類型,對於基本數據類型和日期類型會自動轉換,但日期類型只支持yyyy-MM-dd格式,所以要自定義類型轉換器,轉換器包括局部類型轉換器和全局類型轉換器(先首先在局部類型轉換器中進行查找,如果沒有再去全局類型轉換器中查找)

局部轉換器的開發步驟:
1.寫轉換器類
2.配置轉換器類(在同包的action目錄下,新建一個properties文件,名稱爲action名稱-conversion)
3.配置文件的內容:要轉換的屬性=轉換器類全路徑

全局轉換器的開發步驟:
1.寫轉換器類
2.配置轉換器類(在src目錄下新建properties文件,名稱爲xwork-conversion.properties
3.配置文件的內容:要轉換的全名=轉換器類全路徑

下面是一個全局轉換器的代碼
1.新建轉換器類:
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.properties
java.util.Date=cn.itcast.d_type.MyConverter
發佈了49 篇原創文章 · 獲贊 0 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章