1. 程式人生 > >Struts2的入門之配置檔案和傳值問題

Struts2的入門之配置檔案和傳值問題

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. 從瀏覽器傳至後臺
     
    /**
    	 * 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. 從後臺傳至瀏覽器傳值

* 二.服務端向瀏覽器傳值

 * 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");
	}


  1. ServletRequestAware這個介面中的方法是setServletRequest(HttpServletRequest request) 可以獲得這次請求的request物件
    3、RequestAware這個介面中的方法是setRequest(Map request) 它只能夠獲得這次請求中包含request物件中全部attributes的一個map
  1. 非注入式

高耦合使用方式直接可以獲得到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用法一樣
  1. 值棧傳值

//直接定義一個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";}