Struts2的入門之配置檔案和傳值問題
阿新 • • 發佈:2018-11-08
struts-base.xml檔案詳解這是struts2的基礎配置檔案必須的
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" "http://struts.apache.org/dtds/struts-2.5.dtd"> <struts> <!-- 設定編碼格式 --> <constant name="struts.i18n.encoding" value="UTF-8" /> <!-- 用於jsp除錯,配置這個jsp會報Struts的錯 --> <constant name="struts.devMode" value="true" /> <constant name="struts.configuration.xml.reload" value="true" /> <constant name="struts.i18n.reload" value="true" /> <!-- 動態方法呼叫 --> <constant name="struts.enable.DynamicMethodInvocation" value="true" /> <!-- name 是必須配置的 Package的表示,為了讓其他的package引用 --> <!-- extends 否 從哪個package繼承行為 --> <!-- namespace 否 參考Namespace配置說明 --> <!-- abstract 否 --> <!-- 定義這個package為抽象的,這個package中不需要定義action --> <!-- 這裡是因為分組開發所以將 --> <package name="base" extends="struts-default" abstract="true"> <!-- struts2.5之後動態呼叫需要匹配正則 不是很推薦使用 2.5之前不需要新增 --> <global-allowed-methods>regex:.*</global-allowed-methods> </package> </struts>
使用者基礎檔案struts-xx.xml分組開發時多個檔案的配置
配置這個檔案繼承於剛才配置的基礎檔案用來配置action <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" "http://struts.apache.org/dtds/struts-2.5.dtd"> <struts> <!-- name 是必須配置的 Package的表示,為了讓其他的package引用 --> <!-- extends 否 從哪個package繼承行為 --> <!-- namespace配置之後方便分組開發 然後配置之後請求的時候注意加上名字空間的值 --> <package name="sy" extends="base" namespace="/sy"> <action name="請求的action" class="你寫的類的全路徑限定名" method="方法名"> <!-- 結果碼的處理 --> <result name="方法返回值">/跳轉地址</result> </action> <!-- {1}代表* jsp寫法nameaction_add method的值會自動轉變為add--> <!-- *可以有多個 --> <action name="nameaction_*_*" class="你寫的類的全路徑限定名" method="{1}"> <!-- 結果碼的處理 --> <result name="方法返回值">/跳轉地址</result> </action> </package> </struts> 最後配置一個struts.xml檔案這樣能夠很好的解決分組開發衝突問題 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" "http://struts.apache.org/dtds/struts-2.5.dtd"> <struts> <!-- struts的基本xml檔案 --> <include file="struts-default.xml"></include> <!-- 剛才的基本檔案 --> <include file="struts-base.xml"></include> <!-- n個配置檔案 --> <include file="struts-sy.xml"></include> </struts>
當然如果不想這麼寫可以配置到一個struts.xml檔案中
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" "http://struts.apache.org/dtds/struts-2.5.dtd"> <struts> <package name="default" namespace="/" extends="struts-default"> <action name="Login" class="com.rcnjtech.action.LoginAction"> <result name="success">/success.jsp</result> <result name="login">/index.jsp</result> </action> </package> </struts>
配置web.xml struts2過濾器
Idea是直接會生成的不需要配置,eclipse的全路徑限定名可以通過ctrl+shift+t
可以直接搜尋找到全路徑限定名
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>Struts</display-name>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
Struts2傳值問題
- 從瀏覽器傳至後臺
/** * 1.ModelDriven介面傳值 * 2.set get 方法傳值 * 3.物件導航傳值 */ private Cal cal=new Cal(); private String num1; private Cal cal2=new Cal(); public String getNum1() { return num1; } public void setNum1(String num1) { this.num1 = num1; } public Cal getCal2() { return cal2; } public void setCal2(Cal cal2) { this.cal2 = cal2; } public String execute() { System.out.println("ModelDriven傳值:"+"num1"+cal.getNum1()+" num2:"+cal.getNum2()); System.out.println("get set傳值:"+this.num1); System.out.println("物件導航傳值:"+"num1"+cal2.getNum1()+" num2:"+cal2.getNum2()); return null; } @Override public Cal getModel() { // TODO Auto-generated method stub return cal; }
請求資料:
結果:
如果modeldriven和get set 同時使用 而屬性名重複的話會造成 get set
賦值為空的情況因為ModelDriven中優先順序更高
-
從後臺傳至瀏覽器傳值
* 二.服務端向瀏覽器傳值
* 1.傳統作用域向jsp傳值
* 與j2ee容器互動
* 1.非注入
* 耦合
* 解耦
* 2.注入式
*耦合
* 解耦
* 2.值棧傳值
1注入式需要實現ServletRequestAware,RequestAware,ServletResponseAware等介面
ServletRequestAware等介面是高耦合的方式
private HttpServletRequest req;
@Override
public void setServletRequest(HttpServletRequest arg0) {
//使用此request將值放置此作用域中
this.req=arg0;
}
//RequestAware等介面是低耦合方式
@Override
public void setRequest(Map<String, Object> map) {
//可以直接將值存放於此集合中 和request.setattribute是一樣的
map.put("rs", "4567890");
}
ServletRequestAware這個介面中的方法是setServletRequest(HttpServletRequest request) 可以獲得這次請求的request物件
3、RequestAware這個介面中的方法是setRequest(Map request) 它只能夠獲得這次請求中包含request物件中全部attributes的一個map
- 非注入式
高耦合使用方式直接可以獲得到request物件
其餘的session等同理獲得
ServletActionContext.getRequest()
//低耦合的使用可以(推薦使用)
// 獲取request:
//
// Map request = (Map)ActionContext.getContext().get("request");
//
// 往request裡封裝資料
//
// request.put("name", value);
//
// 在前臺就可以用request.getAttribute("name");
//獲取session
Map session = ActionContext.getContext().getSession();
// 將資料封裝到session中
session.put("name", value);
// 在前臺頁面上用sessionScope.getAttribute("name");得到session裡面封裝的值。
//得到session、request有點區別,得到request用的是get("reqeust"),得到session用的
//是getSession()
//然後還可以這麼使用
ActionContext ctx = ActionContext.getContext();
HttpServletRequest request = (HttpServletRequest)ctx.get(ServletActionContext.HTTP_REQUEST);
HttpServletResponse response = (HttpServletResponse)ctx.get(ServletActionContext.HTTP_RESPONSE);
//用法就和Servlet中的request、response用法一樣
-
值棧傳值
//直接定義一個object 儲存值然後設定其getset方法即可
private Cal cal=new Cal();
private Object res;
public Object getRes() {
return res;
}
public void setRes(Object res) {
this.res = res;
}
public String add() {
this.res=Integer.parseInt(cal.getNum1())+Integer.parseInt(cal.getNum2());
// ServletActionContext.getRequest().setAttribute("rs", Integer.parseInt(cal.getNum1())+Integer.parseInt(cal.getNum2()));
return "success";}