1.struts是一個開源框架(frameset)
2.struts是一個Web框架
3.struts是一個基於MVC的Web框架html
由於咱們對MVC的理解不一樣,可能形成不一樣公司寫程序的時候,規範不統一,這樣不利於程序的維護和擴展以及提升開發效率,因此咱們有必要用一個統一的規範來開發項目。因此出現了struts.java
struts是經過採用Java的Servlet/JSP技術,實現了基於Java EE Web應用的Model-View-Controller(MVC)設計模式的應用框架,是MVC經典設計模式中的一個經典產品程序員
struts的優缺點以下:
1.struts的好處:web
程序更加規範化
程序開發的效率提升了
程序的可讀性增長
程序的可維護性增長apache
2.struts的不足之處:設計模式
form表單有點雞肋
action是單態(對網站併發性的處理有影響)安全
這些內容後面會介紹。併發
咱們要知道的是:框架在提升了程序的規範的同時,也約束了程序員的自由。app
以一個用戶登陸驗證的例子說明。框架
1.ActionServlet是總控制器,它是struts給咱們提供的,咱們無需本身寫,只須要配置便可。ActionServlet管理struts-config.xml文件,而這個文件是struts的核心文件,該文件配置了ActionForm,還配置了Action,以及它們的對應關係等。
2.ActionForm是表單,用於存放數據。開發ActionFrom必需要繼承ActionForm類,這是規範。
3.Action是分控制器,在Struts中,Action能夠有多個.它的本質就是Servlet。開發一個Action也要繼承Action類。
4.Model(Java類,Service類,ejb等)
以上述用戶登陸驗證來演示,而且使用手動配置的方式來開發第一個struts項目,項目名稱爲strutslogin。
首先,項目目錄結構以下所示:
【步驟】:
1.在開發struts的時候,須要struts的開發包
struts的開發包可到官網下載【下載地址】,它的最新版本是2.5.1(2016年6月21日)。因爲目前所學爲1.3的版本,因此我下載Struts 1.3.10。並把全部的jar包加入到當前項目的lib文件夾。
2.先寫出login.jsp
寫最簡單的登陸頁面login.jsp,以下:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> </head> <body> <form action="/strutslogin/login.do" method="post"> UserName:<input type="text" name="username"/><br><br> Password:<input type="password" name="password"/><br><br> <input type="submit" value="Login"/> </form> </body> </html>
login.do
頁面,這裏在稍後介紹的struts-config.xml配置中會再說明。 3.編寫ActionForm和Action
(1)首先須要編寫ActionForm,即用戶登陸所用的表單,用於填充用戶輸入的數據。咱們取名爲UserForm,它繼承自ActionForm類,以下:
public class UserForm extends ActionForm { 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; } }
其實這就是一個很簡單的JavaBean,它和login.jsp中的表單對應,咱們在這個UserForm中定義屬性username
和password
,並生成它們的setter
和getter
方法。
這裏須要注意的是:
<1>.通常的規範:定義屬性名稱的時候應該和jsp頁面的控件名稱同樣。
<2>.但其實,屬性的名稱並不是必定要一致,而真正要保持一致的是setter
和getter
方法。也就是說,若是你在jsp中定義的控件名稱爲username和password,那麼setter
方法的名稱必定是setUsername
和setPassword
,同理,getter
方法的名稱必定是getUsername
和getPassword
。屬性能夠換其餘的名字,可是這幾個方法的名稱必定要固定格式:get/set+控件名稱而且首字母大寫
<3>.但咱們遵照通常的規範最好。
<4>.ActionForm必定要按照上述規範寫好,才能保證數據可以正確填充,才能保證work
(2)而後,編寫Action,即登陸的Action,咱們取名爲LoginAction
,它必須繼承自Action
類,以下:
public class LoginAction extends Action { @Override public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { // 把form轉成對應的UserForm對象 UserForm userForm = (UserForm)form; System.out.println("用戶名="+userForm.getUsername()); System.out.println("密碼="+userForm.getPassword()); // 簡單驗證 if("123".equals(userForm.getPassword())){ // 若是用戶密碼爲123,則爲合法 return mapping.findForward("ok"); }else{ return mapping.findForward("error"); } } }
在這個類中,咱們須要重寫一個方法:excute
。這個方法會處理業務邏輯,會自動調用,它有點相似於Servlet中的service方法,或者doGet/doPost方法。
4.配置struts-config.xml文件,這個文件通常放在/WEB-INF目錄下,它配置Action、ActionForm以及它們的對應關係和跳轉
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Structs Configuration 1.3//EN" "http://struts.apache.org/dtds/struts-config_1_3.dtd"> <struts-config> <!-- 配置表單 --> <form-beans> <!-- name是表單名字,能夠隨意寫,可是建議取名規範:表單類名小寫 --> <!-- type用於指定表單類的全路徑 --> <form-bean name="userForm" type="com.gavin.forms.UserForm"></form-bean> </form-beans> <!-- 配置Action --> <action-mappings> <!-- 配置一個具體的action --> <!-- path表示未來訪問該action的資源名,http://localhost:8080/web/path --> <!-- name用於關聯某個表單 --> <!-- type用於指定該Action類的全路徑 --> <action path="/login" name="userForm" type="com.gavin.actions.LoginAction"> <!-- 這裏配置跳轉關係 --> <!-- name表示結果名稱,path表示轉發到的頁面地址 --> <forward name="ok" path="/WEB-INF/welcome.jsp"/> <forward name="error" path="/WEB-INF/error.jsp"/> </action> </action-mappings> </struts-config>
(1)這個struts-config.xml引入了一個DTD文件:struts-config_1_3.dtd,這個文件能夠在咱們下載的jar包中找到,它定義了咱們這個xml的約束,根元素爲struts-config
。
(2)該配置文件主要經過form-beans來配置ActionForm、經過action-mappings來配置Action。
(3)咱們在form-beans下用form-bean來配置具體的ActionForm,好比當前文件配置了咱們寫的UserForm
(4)在action-mappings下用action來配置具體的Action,好比當前文件配置了咱們寫的LoginAction
(5)要注意這裏action中的path參數配置,它就是咱們的login.jsp中的表單action提交的地址,login.jsp中寫的是login.do
,這個login.do
會交給struts的總控制器ActionServlet來處理,最後ActionServlet將經過必定的機制找到這裏的path參數配置爲/login
的action,再經過該action配置的type參數找到具體的類。
從這個過程當中咱們能夠發現,login.do在經過ActionServlet的處理後,最後找到的倒是路徑爲/login
的action,這彷佛和.do
這個後綴沒有什麼關係,的確是這樣的,這個後綴只是習慣上的用法,咱們徹底能夠在web.xml文件中將這個後綴設置成其餘任何的名字。
(6)最後要在具體的action下配置跳轉關係。這裏配置的參數和LoginAction中的excute
方法所寫要對應起來。
5.寫出welcome.jsp和error.jsp頁面
寫出兩個簡單的界面便可。
6.在web.xml中配置ActionServlet
struts的總控制器ActionServlet本質上仍是一個Servlet,因此咱們要在web.xml中配置,配置以下:
<servlet> <servlet-name>action</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <!-- 指定配置文件struts-config.xml的路徑 --> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>
咱們要在該配置中指定struts-config.xml文件的地址。同時能夠看到,咱們在這裏配置的後綴爲*.do
,也就是說全部以.do
結尾的請求都要交給ActionServlet來處理。到這裏,也就明白了爲何咱們的login.jsp中寫的提交地址爲login.do
。
經過手工完成一個簡單的struts項目,可讓咱們對struts的工做流程和工做原理有更加深入的認識。這個過程略微繁瑣,後面會有工具直接生成,可是掌握底層原理是咱們學習必不可少的一個步驟。
總結一下,其實struts是對咱們經過JSP/Servlet和使用MVC模式開發項目的一個更高層次地提煉,它幫咱們作了大部分工做,咱們只須要按照struts框架提供的流程填充便可,簡化了咱們的開發的難度。
struts中的核心知識點:ActionServlet總控制器,Action分控制器,ActionForm表單,以及最重要的structs-config.xml和web.xml文件的配置。