Struts1.3框架原理剖析(一)
总述
通过本节的学习我们要掌握以下知识点:
- 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配置文件,删除注释后的该配置文件如下
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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>
创建相应的包和接口以及接口的实现类,一下我就按照创建顺序一一贴出所有包的源代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
新建一个接口
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.zhongkewen.dao; import com.zhongkewen.po.User; public interface UserDao { public User findUserByUserName(String username,String password); }
写一个实现上面接口的类,因为我们做的是假的数据,所以登录时设置的用户名和密码默认都是admin
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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; } }
接下来写了两个自定义异常类
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.zhongkewen.exception; //第一个类 public class PasswordWrongException extends RuntimeException { } //第二个类 package com.zhongkewen.exception; public class UserNameNotFoundException extends RuntimeException { }
接下来写service的接口以及该接口的实现方法
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.zhongkewen.service; public interface UserService { public void login(String username,String password); }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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配置文件,配置好后如下文件所示
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<?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
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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页面
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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的修改跳转路径(可以使用在分页当中)