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的修改跳转路径(可以使用在分页当中)
posted @ 2013-06-03 23:29  bod08zhongkewen  阅读(1133)  评论(9编辑  收藏  举报