程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> struts2進階篇(2),struts2進階

struts2進階篇(2),struts2進階

編輯:JAVA綜合教程

struts2進階篇(2),struts2進階


一、Action與MVC

struts2是一個基於MVC的web應用框架,它將應用程序分為三個組件:模型,視圖,控制器。

模型:包含了應用程序的業務邏輯和業務數據,由封裝數據和處理業務的javaBean組成。

視圖:封裝了應用程序的輸出形式,也就是頁面,如jsp,html。

控制器:負責接收用戶的http請求,再調用模型中響應的方法來處理業務,然後調用響應的視圖作為顯示。

三者共同協同處理響應客戶端的請求。

在struts2中控制器分為兩部分:

1.核心控制器:它就是在web.xml中配置的StrutsPrepareAndExecuteFilter負責過濾用戶的所有請求,根據請求不同,分發不同的Action處理。

2.業務控制器:也就是Action,負責調用模型來實現請求的業務,並把結果交給視圖層。

二、Action接收參數

在action中接收用戶從jsp傳入的參數有三種方式:

1.屬性方式

2.JavaBean方式

3.ModelDriven方式

(1).屬性方式:

package action;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class UserAction extends ActionSupport {
	private String username;
	private String password;

	public void setUsername(String username) {
		this.username = username;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	/**
	 * 業務邏輯層
	 */

	public String login() {

		Map<String, Object> map = new HashMap<String, Object>();
		boolean isLogin = (Boolean) map.get("isLogin");
		if (isLogin) {
			// 登錄成功
			// session==>>>>>>>>>>>>
			/**
			 * 得到一個Map對象,相當於jsp中的內置對象session 解耦方式
			 */
			/*
			 * Map<String,Object>
			 * session=ActionContext.getContext().getSession();
			 * session.put("user", map.get("user"));
			 */
			/**
			 * 耦合方式
			 */
			// ServletContext
			// sc=ServletActionContext.getServletContext();//得到Servlet上下文
			HttpServletRequest request = ServletActionContext.getRequest();
			HttpServletResponse response = ServletActionContext.getResponse();
			HttpSession session = request.getSession();
			session.setAttribute("user", map.get("user"));
			return SUCCESS;
		} else {
			return INPUT;
		}
	}

}

login.jsp頁面定義form表單:

<form action="login" method="post">
  		用戶名:<input name="username"/>
  		密碼:<input name="password"/>
  		<input type="submit" value="提交"/>
  		<input type="reset" value="重置"/>
</form>

說明:

1.在form表單中的用戶名和密碼的<input>標簽中的name屬性username和password,和action中的定義的成員變量username和password形同,在提交表單時struts會把值賦為形同的字段名。

2.如果上傳的包含中文,則action接收可能存在亂碼,可以修改struts.xml文件,添加<constant name="struts.i18n.encoding" value="utf-8">

二、JavaBean的方式

1、定義User對象實體類,並添加username,password和相應的get,set方法

package entity;

public class User {
	private String username;
	private String password;
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	

}

2.添加JavaBean的action,添加User類型的成員變量user,和get,set方法,execute()方法

package action;

import com.opensymphony.xwork2.ActionSupport;

import entity.User;

public class UserActionByJavaBean extends ActionSupport {
	private User user;

	@Override
	public String execute() throws Exception {
		return "success";
	}

	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}
	

}

3.form表單中添加頁面代碼:

<form action="login" method="post">
  		用戶名:<input name="user.username"/>
  		密碼:<input name="user.password"/>
  		<input type="submit" value="提交"/>
  		<input type="reset" value="重置"/>
</form>

說明:

1.在提交form表單時會將屬性值通過User實體屬性傳遞給Action,但必須保持前後屬性的一致性。

2.在jsp頁面中,可以實用<s:property value ="user.username"/>輸出Action中的user對象的username屬性的值。

三、ModelDriven方式接收參數

在action中實現ModelDriven接口來接收客戶端上傳的參數,這種方式任然需要實體User。

它的運行過程是:Struts2調用ModelDriven接口中的getModel()方法取得Action中的user對象,再把上傳的用戶名密碼存入user對象。

package action;

import com.opensymphony.xwork2.ModelDriven;

import entity.User;

public class UserActionByModelDriven implements ModelDriven {
	private User user = new User();

	@Override
	public Object getModel() {
		return null;
	}
	public String execute(){
		return "success";
	}

}

UserAction類中的User對象用來接收用戶名,密碼。getModel()是ModelDriven接口中定義的方法,它提供了類對外user對象的訪問。

<form action="login" method="post">
  		用戶名:<input name="username"/>
  		密碼:<input name="password"/>
  		<input type="submit" value="提交"/>
  		<input type="reset" value="重置"/>
</form>

說明:

1.使用ModelDriven方式接收頁面參數,name屬性不需要添加對象,name="username";

三、Struts.xml中<action>標簽中method屬性的用法

1.在<action>的配置代碼中method屬性默認調用action類的execute()方法,但是在實際應用中一個action需要處理很多方法,就可以添加method="不同的方法名"來調用acton中對應的方法。

<?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>
		<constant name="struts.devMode" value="true" />
		<constant name="struts.i18n.encoding" value="utf-8" />
    <package name="default" namespace="/" extends="struts-default">
		
	<action name="login" class="action.UserAction" method="login">
		<result type="chain">all</result>
		<result name="input">login.jsp</result>
	</action>
	
	<action name="all" class="action.DeptAction" method="getDept">
		<result>list.jsp</result>
	</action>

    </package>
</struts>

  上面<action>標簽中定義method='login'和method='getDept'方法,就會請求Action類中方法名為login和getDept的方法。

2.動態方法調用

<?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>
		<constant name="struts.devMode" value="true" />
		<constant name="struts.i18n.encoding" value="utf-8" />
    <package name="default" namespace="/" extends="struts-default">
	
    <action name="all" class="action.DeptAction">
		<result>list.jsp</result>
	</action>
    </package>
</struts>
    

  不難發現上面的方法並沒有指定具體調用哪個方法,這是應為在下面的form表單中指定。

<form action="login!getAllDept" method="post">
  		用戶名:<input name="user.username"/>
  		密碼:<input name="user.password"/>
  		<input type="submit" value="提交"/>
  		<input type="reset" value="重置"/>
</form>

  在form表單中的action="login!getAllDept"會調用Action類中的getAllDept方法。

不難發現動態調用的語法是:actionName !methodName.action,其中.action可以省略,但是值得注意的是,動態方法調用可能會帶了安全隱患,暴露業務方法給用戶,官方也不推薦這樣用,不過可以在struts.xml中添加<constant name="struts.enable.DynamicMethodInvocation" value="false"/>來禁用動態方法調用。

四、使用通配符簡化struts.xml中<action>標簽的配置

1.在<action>中使用通配符簡化配置

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>
		<constant name="struts.devMode" value="true" />
		<constant name="struts.i18n.encoding" value="utf-8" />
    <package name="default" namespace="/" extends="struts-default">
		<!-- 定義默認攔截器 -->
		<default-interceptor-ref name="myDefault"/>	
                 <action name="index">
		        <result>index.jsp</result>
	          </action>
	<action name="host_*" class="action.HouseAction" method="{1}">
		<result>list_{1}.jsp</result>
	</action>

    </package>
</struts>

  以上的配置在jsp頁面的<form action="house_add"></form>或者<form action="house_update"></form>都會得到響應的請求,也就是action屬性是house_任意字符都會得到請求,返回result中的list_任意字符的jsp頁面,也就是house_後面的字符和{1}是一樣的匹配。

問題:當有多個<action>匹配的時候會匹配哪個?

假如有下配置會匹配哪個呢:

<?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 name="house_add" class="action.HouseAction" method="add">
		<result name="success">add.jsp</result>
	</action>
	
	<action name="house_*" class="action.HouseAction" method={1}>
		<result>{1}.jsp</result>
	</action>
    </package>
</struts>

  答案:如果有完全匹配的就優先使用完全匹配的,沒有完全匹配的使用通配符匹配,如果有多個通配符匹配的,按照先後順序優先使用在前的匹配。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved