Struts2(1) jsp 與 java 代碼數據的雙向傳遞

Struts2框架

struts2是一個基於MVC設計模式的Web應用框架。他封裝、簡化了很多原生功能。

我常用它實現 jsp 與 java 代碼的數據交換。一般使用servlet進行數據交換的,然而代碼一多就不直觀了,這時候推薦使用struts2或者其他框架,代替servlet中的get/post方法。

目錄

簡單案例(瞭解過程與配置)

Struts2的通用配置

實際例子(瞭解Jsp與Java代碼的數據傳遞)

一、jsp傳遞數據給java

二、java傳遞數據給jsp

小結

一、jsp->java

二、java->jsp

小改進(選看)


 

簡單案例(瞭解過程與配置)

使用struts2訪問 hellojava.java,如果java文件返回信息"success"則跳轉到hellojsp.jsp歡迎界面。

(1) 首先寫hellojava.java:

爲了方便代碼的管理我將hellojava.java放到action包下(包名隨意)。

位置:項目->Java Resources->src->action(新建包)->hellojava.java

public class hellojava {
	public String execute(){
		return "success";
	}
}

(2) 然後再寫hellojsp.jsp:

位置:項目->WebContent->hellojsp.jsp

My first strusts is running success!

(3) 配置struts2信息。

Struts2的通用配置

任何一個使用到struts2框架的項目代碼一定有以下配置:

1、導入核心包(本例中只導入最最基本的八個struts2的庫文件)

位置:項目->WebContent->WEB-INF->lib

 

2、web.xml的配置編寫(一般這麼寫,特殊需求除外)

位置:項目->WebContent->WEB-INF->lib->web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
  <display-name>Struts2Demo</display-name>
  
   <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
  
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
</web-app>

 

3、struts.xml的配置編寫(即“結果視圖類型”)

位置:項目->Java Resources->src->struts2.xml(注意文件位置~!和web.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>
    <package name="default" extends="struts-default">
        <action name="helloword" class="action.hellojava" method="execute" >
			<result name="success" >/hellojsp.jsp</result>
        </action>
    </package> 
</struts>

【解釋】其中最主要修改的地方是<action>標籤內的內容。

如字面意思,該標籤定義了一個action,這個action可以訪問的class是“action.hellojava”(其中action是包),action的名字爲helloword,這個用於我們訪問java文件的入口。而訪問方法method爲execute()方法(默認的也是execute()),也可以設置爲其他。

<result name>表示當返回值爲success時,跳轉到hellojsp.jsp頁面。

(由於result默認爲success,所以該句代碼也等價於<result>/hellojsp.jsp</result>)

【輸入地址】http://localhost:8080/自己的項目名/helloword

【運行結果】

 


實際例子(瞭解Jsp與Java代碼的數據傳遞)

一、用戶在登錄界面login.jsp輸入自己的信息,傳遞信息到LoginFormAction.java進行信息匹配。

二、如果信息匹配成功(即登陸成功,返回爲success)則跳到 welcom.jsp 界面,並顯示 “歡迎你!xx(用戶名)”。

         失敗(返回值爲 input)則回 login.jsp 頁面。

 

一、jsp傳遞數據給java

(1)首先根據題意,更改我們的struts.xml。

爲了方便代碼的管理我仍然將LoginFormAction.java放到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>
    <package name="default" extends="struts-default">
        
         <action name="login" class="action.LoginFormAction">
   			<result name="success">/welcom.jsp</result>
   			<result name="input">/login.jsp</result>
   		 </action>
    	
    </package> 
</struts>

其中名爲login的action,是進行登錄信息匹配的action.

(2)login.jsp

這裏的重點是已經定義好了<form>表單提供的action的名字是login。

需要傳遞的值是username和password。

<form action="login" method="post">
		username:<input name="username"><br>
		password:<input name="password"><br>
		<input type="submit" value="login">
</form>

(3)java代碼的編寫

最核心的點在於:需要傳遞的變量值,必須在接收方——java中定義該變量的set\get方法。

LoginFormAction.java

位置:項目->Java Resources->src->action->LoginFormAction.java

public class LoginFormAction {
	private String username,password;

	public String execute(){
		if(username.equals("ac")&&password.equals("123")){
			return "success";
		}
		return "input";
	}


	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;
	}
}

【注】此信息匹配的代碼可以替換成數據庫操作的相關代碼。在此爲了簡潔,略,僅設置一個用戶(名ac,密碼123)。

 

二、java傳遞數據給jsp

在這裏使用EL表達式可以直接取值。

(4)welcom.jsp

Welcome ${username}!

 

【運行結果】運行login.jsp


 

小結

一、jsp->java

(1)使用常規的servlet

(2)使用struts2等框架,重點是在接收方的java代碼中,將要傳遞的變量設置好set\get方法。

二、java->jsp

 (1)EL表達式直接獲取

 (2)使用session存值

例如在本例中,如果

<result name="success">/welcom.jsp</result>

返回的方式改成了重定向,如下(兩次請求。不寫name=“success”也可以,因爲不寫,則<result>默認有這個標籤名和值)

<result type="redirect">/welcom.jsp</result>

那麼則LoginFromAction.java中能在信息匹配成功後添加如下代碼,設置session:

ActionContext aContext = ActionContext.getContext();
Map session = 	aContext.getSession();
session.put("username", getUsername());

 

小改進(選看)

爲了開發的“可維護性”,最好將用戶對象抽出來,例如本例中,可以抽出一個實例對象User,其餘代碼略改。

User.java

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;
	}
}

LoginFormAction.java

public class LoginFormAction {
	private User user;
	public void setUser(User user){		 
		this.user = user;
	}
	public User getUser(){
		return this.user;
	}
	//登錄方法
	public String execute(){
		public String execute(){
			if(user.getUsername().equals("ac")&&user.getPassword().equals("123")){
				return "success";
			}
			return "input";
		}
	}
}

login.jsp

<form action="login" method="post">
		username:<input name="user.username"><br>
		password:<input name="user.password"><br>
		<input type="submit" value="login">
</form>

welcom.jsp

	Welcome ${user.username}!

struct.xml

不用變

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章