Struts1.3框架原理剖析(一)


總述

  通過本節的學習我們要掌握以下知識點:

  1. Struts的搭建過程
  2. Struts的原理
  3. action標簽對的寫法以及配置

一、概念

  其實在我們不使用任何框架開發一個項目的時候會發現代碼太多,需要寫的東西也太多了,比如說我們是用MVC設計模式的時候在寫Servlet的時候每一個請求要對應一個Servlet,這樣不僅僅增加了代碼的數量,也更是使代碼的整合性大大降低,然后這個Struts框架也就恰恰彌補了當前這個缺點,他使用簡單,使得代碼簡潔整合性大大提升。那么接下來我們接着談談如何創建一個簡單的Struts框架。大家可以點擊這里下載最新的struts開發包。

二、搭建過程

  1. 導入Struts抱下的該目錄下struts-1.3.10\lib的所有jar包
  2. 找到struts-1.3.10\apps\struts-blank-1.3.10\WEB-INF下的struts_config.xml配置文件,把該文件拷貝到我們所新建的項目下,然后刪除注釋只留下<struts-config>標簽對以及對文檔的定義
  3. 在我們新建的工程下對web.xml文件配置好action,我們可以把struts-1.3.10\apps\struts-blank-1.3.10\WEB-INF下的web.xml中的servlet和servlet-mapping標簽對中的配置拷貝過去即可
  4. 在新建一個類繼承至Action(apache包下面的),然后在重寫execute方法,該方法里面返回的是ActionForward(這里我們要知道actionmapping代表的是一對action標簽)
  5. 根絕實際情況配置好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>
struts-config。xml原始配置

  創建相應的包和接口以及接口的實現類,一下我就按照創建順序一一貼出所有包的源代碼

 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 }
com.zhongkewen.po

     新建一個接口

package com.zhongkewen.dao;

import com.zhongkewen.po.User;

public interface UserDao {
    public User findUserByUserName(String username,String password);
}
package com.zhongkewen.dao

  寫一個實現上面接口的類,因為我們做的是假的數據,所以登錄時設置的用戶名和密碼默認都是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.dao.impl

  接下來寫了兩個自定義異常類

package com.zhongkewen.exception;
//第一個類
public class PasswordWrongException extends RuntimeException {

}
//第二個類
package com.zhongkewen.exception;

public class UserNameNotFoundException extends RuntimeException {
    
}
package com.zhongkewen.exception

  接下來寫service的接口以及該接口的實現方法

package com.zhongkewen.service;
public interface UserService {
    public void login(String username,String password);
}
package com.zhongkewen.service
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();
            }
        }
    }
}
package com.zhongkewen.service.impl

  好,以上都是一些簡單的我們以前都要知道的設計模式,接下來就是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>
web.xml

  下面新建一個類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 }
package com.zhongkewen.action

  接下來我們寫一個簡單的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="登錄">&nbsp;
15         <input type="reset" value="清空">&nbsp;
16     </form>
17 </body>
18 </html>
index.jsp

  最后的話我們配置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進行統一的跳轉。

四、總結

  以上就是我們這次需要掌握的知識。其實現在還比較簡單,因為還沒有涉及到其它額外的知識。

  在接下來的博文當中將會講到一下三個知識點:

  1. ActionForm對象以及ActionForm的設計膨脹問題的解決辦法
  2. Action設計膨脹問題的解決辦法
  3. ActionForward的修改跳轉路徑(可以使用在分頁當中)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM