Struts2 動態方法呼叫(十三)

迎著太陽走向遠方發表於2017-03-27
附件中有完整的案例!
1.動態方法呼叫

在業務邏輯處理action中,可以包含一個或者多個邏輯處理方法。
例如:在jsp檔案中的同一個form表單中 有多個用來提交的表單值的按鈕,可當使用者通過不通的按鈕提交表單的時候,需要笤俑Action中的不同的處理方法,這是就需要使用動態方法呼叫。
在使用動態方法呼叫時候,提交請求的action屬性值,有以下幾種方法
  action=“Action名稱!方法名”
或者
  action=“Action名稱!方法名.action”
或者
  採用萬用字元 {}來進行動態方法呼叫 
或者
  method 配置多個同一個action 不同的 method


2.案例:登入/註冊(採用  “!” “萬用字元”“ method屬性” 三種方法實現 )
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>
	<!--==================== -->
	<!--=====定義常量========= -->
	<!--==================== -->
	
	<!-- 修改請求的字尾名為.do 修改後每個請求必須要有字尾了-->
	<constant name="struts.action.extension" value="do,action"/>
	<!-- 對於 採用 "!方法名"這種方法有用 ,採用萬用字元就不需要設定這個了 -->
	<constant name="struts.enable.DynamicMethodInvocation" value="false"/> 
	<!-- 預設的檢視主題 <constant name="struts.ui.theme" value="simple"/>-->
	<!--+===================+-->
	<!--+=====定義基本包=======+-->
	<!--+===================+-->
	<package name="default" extends="struts-default">
		<action name="showPerson" class="com.luob.action.ShowPerson">
			<result name="success">/showPerson.jsp</result>
		</action>
	</package>
	
	<!-- 使用“!”進行動態方法的呼叫 -->
	<package name="user" extends="struts-default" namespace="/user">
		<action name="loginRegister" class="com.luob.action.ShowPerson">
			<result name="success">/index.jsp</result>
			<result name="reg">/initPerson.jsp</result>		
		</action>
	</package>
	
	<!--使用萬用字元  來進行動態方法的呼叫 -->
	<package name="user2" extends="struts-default" namespace="/user2">
		<action name="userAction_*_*" class="com.luob.action.ShowPerson" method="{1}">
			<result name="success">/index.jsp</result>
			<result name="reg">/initPerson.jsp</result>		
		</action>
	</package>
	
	<!-- 使用Method來動態指定呼叫某個Action中的方法 -->
	<package name="user3" extends="struts-default" namespace="/user3">
		<action name="login" class="com.luob.action.ShowPerson">
			<result name="success">/index.jsp</result>
		</action>
		<action name="register" class="com.luob.action.ShowPerson" method="register">
			<result name="reg">/initPerson.jsp</result>		
		</action>
	</package>
	
</struts>


Action.java

package com.luob.action;

import com.luob.model.Person;
import com.opensymphony.xwork2.ActionSupport;

public class ShowPerson extends ActionSupport {

	private Person person;  //採用POJO的方式進行賦值和存值
    private String tip;
	@Override
	public String execute() throws Exception {
		// TODO Auto-generated method stub
		setTip("您單擊了【登入】按鈕!您使用帳號"+person.getName()+"登入成功!");
		return SUCCESS;
	}
	
	public String register(){
		setTip("您單擊了【註冊】按鈕!親填寫下面的資訊吧!");
		return "reg";
	}
	
	public Person getPerson() {
		return person;
	}
	public void setPerson(Person person) {
		this.person = person;
	}
	public String getTip() {
		return tip;
	}
	public void setTip(String tip) {
		this.tip = tip;
	}
}


login.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags"  prefix="s"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    <title>My JSP 'login.jsp' starting page</title>
	<SCRIPT type="text/javascript">
		function reg(){
			var targetForm=document.forms[0];
			targetForm.action="user/loginRegister!register.action";
			targetForm.submit();
		}
		
		function reg2(){
			var targetForm=document.forms[1];
			targetForm.action="user2/userAction_register.action";
			targetForm.submit();
		}
		
		function reg3(){
			var targetForm=document.forms[2];
			targetForm.action="user3/register.action";
			targetForm.submit();
		}
	</SCRIPT>

  </head>
  
  <body>
 	 <center>
 	 	<!-- 使用 “!”來動態呼叫方法 -->
    	<s:form action="user/loginRegister!execute.action" method="post" theme="simple">
    		<ul style="list-style: none;">
    			<li>帳號:<s:textfield name="person.name"/></li>
    			<li>密碼:<s:textfield name="person.password"/></li>
    			<li>
    				<input type="button" value="註冊" onclick="reg()"/>
    				<s:submit value="登入"/>
    			</li>
    		</ul>
    	</s:form>
    	
    	<!-- 採用萬用字元 進行方法動態呼叫 -->
    	<s:form action="user2/userAction_.action" method="post" theme="simple">
    		<ul style="list-style: none;">
    			<li>帳號:<s:textfield name="person.name"/></li>
    			<li>密碼:<s:textfield name="person.password"/></li>
    			<li>
    				<input type="button" value="註冊" onclick="reg2()"/>
    				<s:submit value="登入"/>
    			</li>
    		</ul>
    	</s:form>
    	<!-- 採用method屬性動態呼叫方法-->
    	<s:form action="user3/login.action" method="post" theme="simple">
    		<ul style="list-style: none;">
    			<li>帳號:<s:textfield name="person.name"/></li>
    			<li>密碼:<s:textfield name="person.password"/></li>
    			<li>
    				<input type="button" value="註冊" onclick="reg3()"/>
    				<s:submit value="登入"/>
    			</li>
    		</ul>
    	</s:form>
    </center>
  </body>
</html>


initPerson.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    <title>My JSP 'initPerson.jsp' starting page</title>
  </head>
  
  <body>
   <center>
   	<s:form action="showPerson" method="post">
   		<s:textfield name="person.name" label="姓名"/>
   		<s:textfield name="person.sex"  label="性別"/>
   		<s:textfield name="person.age" label="年齡"/>
   		<s:textfield name="person.address" label="住址"/>
   		<s:submit value="提交"/>
   	</s:form>
   </center>
  </body>
</html>

相關文章