Struts2框架
struts2是一個基於MVC設計模式的Web應用框架。他封裝、簡化了很多原生功能。
我常用它實現 jsp 與 java 代碼的數據交換。一般使用servlet進行數據交換的,然而代碼一多就不直觀了,這時候推薦使用struts2或者其他框架,代替servlet中的get/post方法。
目錄
簡單案例(瞭解過程與配置)
使用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
不用變