今天嘗試struts2的搭建,遇到不少的問題,終於一一解決,逛了很多地方,最終完成搭建
1、首先要下載struts2的一些組件,我下載的是版本2.3.4.1,Eclipse是4.6版本的。由於版本的不斷升級,導致在搭建的過程中,和過去相對較舊的版本搭建有了一些差別,不過問題不是很大。工程截圖如下:
2、解壓下載的組件,在lib目錄下找到其中的以下組件:
commons-fileupload-1.2.2.jar
commons-io-2.2.jar
commons-lang3-3.2.jar
commons-logging-1.1.1.jar
freemarker-2.3.19.jar
javassist-3.11.0.GA.jar(一定要將這個jar復制過去,這是和以前的版本不同的地方)
ognl-3.0.5.jar
struts2-core-2.3.4.1.jar
xwork-core-2.3.4.1.jar
將這些組件復制到建立的web工程下的WEB-INF/lib目錄中,這些組件其實就是編譯好的類文件。
3、接下來就是配置struts.xml文件。這個文件就好像起着一個過濾器的作用,用戶發來的請求要經過該文件的過濾,根據用戶請求中所請求的處理類型,來選擇相應的處理邏輯。
以下是一個struts.xml文件的例子:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> 3 4 <struts> 5 <include file="struts-default.xml" /> 6 <package name="struts" extends="struts-default"><!--注意 namespace="/demo"寫,那么login.jsp中的form標簽的action屬性中必須寫--> 7 <action name="login" class="com.sid.action.Login" method="execute"> 8 <result name="success">/success.jsp</result> 9 <result name="fail">/fail.jsp</result> 10 </action> 11 </package> 12 </struts>
在struts.xml中,是采用package來管理各種action的。
package標簽中的namespace指定了該包的命名空間。
extends是說當前這個包繼承自struts-default包,可以在struts2-core-2.2.3.1.jar中的struts-default.xml文件中找到這個包,這個包被定義成抽象的,它不能包含有action。
包中的每一個action標簽都和一個邏輯處理類進行了映射,name指定了這個action的名字,和包的namespace組合起來,可以直接訪問這個邏輯處理類。
class指定了邏輯處理類的位置,method指定了進行邏輯處理類中進行邏輯處理的方法,這個execute很重要,而且它有固定的返回類型,就是String。
result標簽就是根據邏輯判斷之后,execute方法返回的字符串,根據返回的字符串,來進入到指定的頁面。這里一定要把跳轉的地址寫清楚,明白。否則瀏覽器會報404的錯誤。
4、根據struts.xml的配置,我們需要建立兩個jsp文件:success.jsp和fail.jsp,還有一個Login類,以及一個登錄頁面的login.jsp文件。
在WebRoot目錄下,建立login.jsp文件:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 5 <html> 6 <head> 7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 8 <title>Insert title here</title> 9 </head> 10 <body> 11 <form action="login" method="post"> 12 賬號:<input type="text" name="username"/><br /> 13 密碼:<input type="password" name="password"/><br /> 14 <input type="submit" value="登錄"/> 15 </form> 16 </body> 17 </html>
在src目錄下,寫Login類:
1 package com.sid.action; 2 import com.opensymphony.xwork2.ActionSupport; 3 public class Login extends ActionSupport { 4 5 private static final long serialVersionUID = 1L; 6 private String username; 7 private String password; 8 public String execute() 9 { 10 if("admin".equals(this.username) && "123456".equals(this.password)) 11 return "success"; 12 else 13 return "fail"; 14 } 15 public String getUsername() { 16 return username; 17 } 18 public void setUsername(String username) { 19 this.username = username; 20 } 21 public String getPassword() { 22 return password; 23 } 24 public void setPassword(String password) { 25 this.password = password; 26 } 27 }
由於success.jsp和fail.jsp頁面並不想讓用戶直接訪問到,而是通過登錄頁面,做個簡單的邏輯判斷之后,在根據判斷結果跳轉到相應的頁面。
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7 <title>Insert title here</title> 8 </head> 9 <body> 10 ====>登錄成功!<br /> 11 賬號:${request.username}<br /> 12 密碼:${request.password} 13 </body> 14 </html>
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7 <title>Insert title here</title> 8 </head> 9 <body> 10 ---->登錄失敗! 11 </body> 12 </html>
5、配置web.xml文件,這也是很關鍵的一步,在啟動服務器時,服務器要根據這個文件去進行初始化。而struts2和struts1啟動有很大的不同,它是通過過濾器來啟動的,而struts1是通過加載servlet來啟動的,故應向web.xml中加入如下內容:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> 3 <display-name>Struts2</display-name> 4 <!--配置sturts2啟動代碼 --> 5 <filter> 6 <filter-name>struts2</filter-name> 7 <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class><!-- 注意在2.1.3以上版本需使用此class --> 8 </filter> 9 <filter-mapping><!-- 配置url路徑 --> 10 <filter-name>struts2</filter-name> 11 <url-pattern>/*</url-pattern> 12 </filter-mapping> 13 14 <welcome-file-list> 15 <welcome-file>index.jsp</welcome-file> 16 <welcome-file>default.jsp</welcome-file> 17 </welcome-file-list> 18 </web-app>
經過這幾步后,啟動你的服務器,在地址欄輸入登錄界面的地址,一個簡單的struts2框架就搭建好了……
如果出現404等錯誤請查看你的login.jsp的form標簽的action屬性的路徑是否寫對且與struts.xml的namespace屬性同步,要么都不寫,要么都寫上。