總述
通過本節的學習我們要掌握以下知識點:
- Struts的搭建過程
- Struts的原理
- action標簽對的寫法以及配置
一、概念
其實在我們不使用任何框架開發一個項目的時候會發現代碼太多,需要寫的東西也太多了,比如說我們是用MVC設計模式的時候在寫Servlet的時候每一個請求要對應一個Servlet,這樣不僅僅增加了代碼的數量,也更是使代碼的整合性大大降低,然后這個Struts框架也就恰恰彌補了當前這個缺點,他使用簡單,使得代碼簡潔整合性大大提升。那么接下來我們接着談談如何創建一個簡單的Struts框架。大家可以點擊這里下載最新的struts開發包。
二、搭建過程
- 導入Struts抱下的該目錄下struts-1.3.10\lib的所有jar包
- 找到struts-1.3.10\apps\struts-blank-1.3.10\WEB-INF下的struts_config.xml配置文件,把該文件拷貝到我們所新建的項目下,然后刪除注釋只留下<struts-config>標簽對以及對文檔的定義
- 在我們新建的工程下對web.xml文件配置好action,我們可以把struts-1.3.10\apps\struts-blank-1.3.10\WEB-INF下的web.xml中的servlet和servlet-mapping標簽對中的配置拷貝過去即可
- 在新建一個類繼承至Action(apache包下面的),然后在重寫execute方法,該方法里面返回的是ActionForward(這里我們要知道actionmapping代表的是一對action標簽)
- 根絕實際情況配置好struts_config.xml配置文件。
那么接下來我們就來創建一個簡單的struts
范例:創建一個用戶登錄的簡單struts
導入struts-1.3.10\apps\struts-blank-1.3.10\WEB-INF下的struts_config.xml配置文件,刪除注釋后的該配置文件如下

1 <?xml version="1.0" encoding="ISO-8859-1" ?> 2 <!DOCTYPE struts-config PUBLIC 3 "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN" 4 "http://struts.apache.org/dtds/struts-config_1_3.dtd"> 5 6 <struts-config> 7 </struts-config>
創建相應的包和接口以及接口的實現類,一下我就按照創建順序一一貼出所有包的源代碼

1 package com.zhongkewen.po; 2 3 public class User { 4 private int id; 5 private String username; 6 private String password; 7 public int getId() { 8 return id; 9 } 10 public void setId(int id) { 11 this.id = id; 12 } 13 public String getUsername() { 14 return username; 15 } 16 public void setUsername(String username) { 17 this.username = username; 18 } 19 public String getPassword() { 20 return password; 21 } 22 public void setPassword(String password) { 23 this.password = password; 24 } 25 }
新建一個接口

package com.zhongkewen.dao; import com.zhongkewen.po.User; public interface UserDao { public User findUserByUserName(String username,String password); }
寫一個實現上面接口的類,因為我們做的是假的數據,所以登錄時設置的用戶名和密碼默認都是admin

package com.zhongkewen.dao.impl; import com.zhongkewen.dao.UserDao; import com.zhongkewen.po.User; public class UserDao4MySelf implements UserDao { public User findUserByUserName(String username, String password) { User user = null; if("admin".equals(username)){ user = new User(); user.setUsername(username); user.setPassword(password); } return user; } }
接下來寫了兩個自定義異常類

package com.zhongkewen.exception; //第一個類 public class PasswordWrongException extends RuntimeException { } //第二個類 package com.zhongkewen.exception; public class UserNameNotFoundException extends RuntimeException { }
接下來寫service的接口以及該接口的實現方法

package com.zhongkewen.service; public interface UserService { public void login(String username,String password); }

package com.zhongkewen.service.impl; import com.zhongkewen.dao.UserDao; import com.zhongkewen.dao.impl.UserDao4MySelf; import com.zhongkewen.exception.PasswordWrongException; import com.zhongkewen.exception.UserNameNotFoundException; import com.zhongkewen.po.User; import com.zhongkewen.service.UserService; public class UserService4MySelf implements UserService { private UserDao userdao = new UserDao4MySelf(); public void login(String username, String password) { User user = null; user = userdao.findUserByUserName(username, password); if(user == null){ throw new UserNameNotFoundException(); } else{ if(!"admin".equals(user.getPassword())){ throw new PasswordWrongException(); } } } }
好,以上都是一些簡單的我們以前都要知道的設計模式,接下來就是struts的核心代碼了。
配置好web.xml配置文件,配置好后如下文件所示

<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <display-name></display-name> <servlet> <servlet-name>action</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <load-on-startup>2</load-on-startup> </servlet> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
下面新建一個類UserAction繼承至action

1 package com.zhongkewen.action; 2 3 import javax.servlet.http.HttpServletRequest; 4 import javax.servlet.http.HttpServletResponse; 5 6 import org.apache.struts.action.Action; 7 import org.apache.struts.action.ActionForm; 8 import org.apache.struts.action.ActionForward; 9 import org.apache.struts.action.ActionMapping; 10 import org.apache.struts.action.DynaActionForm; 11 12 import com.zhongkewen.actionform.LoginActionForm; 13 import com.zhongkewen.exception.PasswordWrongException; 14 import com.zhongkewen.exception.UserNameNotFoundException; 15 import com.zhongkewen.po.User; 16 import com.zhongkewen.service.impl.UserService4MySelf; 17 18 public class UserAction extends Action { 19 20 @Override 21 public ActionForward execute(ActionMapping mapping, ActionForm form, 22 HttpServletRequest request, HttpServletResponse response) 23 throws Exception { 24 String username = request.getParameter("username"); 25 String password = request.getParameter("password"); 26 27 String forwardName = "success"; 28 try { 29 new UserService4MySelf().login(username, password); 30 } catch (UserNameNotFoundException e) { 31 forwardName = "error"; 32 } catch (PasswordWrongException e) { 33 forwardName = "error"; 34 } 35 36 return mapping.findForward(forwardName); 37 } 38 39 }
接下來我們寫一個簡單的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 用戶登錄 11 <form action="login" method="post"> 12 username:<input type="text" name="username"><br> 13 password:<input type="text" name="password"><br> 14 <input type="submit" value="登錄"> 15 <input type="reset" value="清空"> 16 </form> 17 </body> 18 </html>
最后的話我們配置struts_config.xml文件只需要在標簽對里面添加如下代碼即可
<struts-config>
<action-mappings>
<action path="/login" type="com.zhongkewen.action.UserAction">
<forward name="success" path="/ok.jsp"></forward>
<forward name="error" path="error.jsp"></forward>
</action>
</action-mappings>
</struts-config>
這樣我們這個簡單的struts項目就搭建完畢了!
三、原理
所有視圖層的.do請求都會被Struts的中央控制器ActionServlet截獲到,ActionServlet會根據Struts_comfig.xml中的配置,把請求分發給相應的action進行處理,調用action中的execute方法,這個方法返回給actionServlet一個ActionForward對象,ActionServlet根據ActionForward進行統一的跳轉。
四、總結
以上就是我們這次需要掌握的知識。其實現在還比較簡單,因為還沒有涉及到其它額外的知識。
在接下來的博文當中將會講到一下三個知識點:
- ActionForm對象以及ActionForm的設計膨脹問題的解決辦法
- Action設計膨脹問題的解決辦法
- ActionForward的修改跳轉路徑(可以使用在分頁當中)