Struts框架——(二)Struts原理with登录实例

二. Struts基本工作流程

假设现在有以下情景:

用户正在浏览一个用STRUTS的技术构建的网站主页,主页上有个登陆表单,用户填好登陆名和密码,单击“登陆”按钮,就激活了以下一系列过程:

(1)用户的请求以HTTP方式传输到服务器上,接受请求的是ActionServlet.

(2)ActionServlet接收到请求后,会查找Struts-config.xml文件来确定服务器上是否有用户请求的操作,此处用户请求操作应为登陆操作。如果没有,则返回一个用户请求无效的出错信息。

(3)当ActionServlet请求找到用户请求的Action后,首先将用户输入的表单参数打包成一个ActionFrom对象,这个ActionFrom对象其实也就是一个JavaBean,里面包含两个字段,分别是用户名和密码。接着ActionServlet再根据struts-config.xml中的配置信息决定是否要执行ActionFrom对象中的Validate方法。若Validate方法执行有错,则返回。否则,继续下一步。

(4)系统生成一个用户所请求的Action的实例对象,将前面的ActionFrom对象传递给它,运行它的Execute()方法。这一步其实就是用户登陆的控制器,在执行exectue()方法时,可以调用后台模型验证登陆名和密码是否正确等信息。

(5)execute()执行结束前会生成一个ActionForward类型的对象并将之返回给ActionServlet,该对象的作用是告诉ActionFroward就代表跳转到一个登陆成功的页面。ActionServlet将对之进行分析,其实就相当于接收到一个新的请求,重复(2)~(5)的过程,直到将某个界面返回给用户为止!

以上就是STRUTS的基本工作流程,解释得比较粗,用活动图描述如下:

使用时序图来描述一下登录功能的处理流程:

与JSP + Servlet 比较:封装了ActionServlet,通过ActionForm来封装Request的参数。以登录为例:

1. View层:JSP:

<form action="login.do" method="post">
    <input type="text" name="name" />
    <br />
    <input type="password" name="password" />
    <input type="submit" value="登录"/>
</form>    

LoginSuccess.jsp:

<body>
     登录成功
</body>  

LoginFail.jsp:

<body>
    登录失败
 </body>  

2. Controller层:

原来的结构:

1)controller.java(ActionServlet):负责截取URL,创建新的action, 分派转发新的URL

2)loginAction.java; modifyAction.java:调用业务逻辑层的方法

现在:LoginAction.java, userActionForm.java

LoginAction.java:

 1 package com.jialin;
 2 import javax.servlet.http.HttpServletRequest;
 3 import javax.servlet.http.HttpServletResponse;
 4
 5 import org.apache.struts.action.Action;
 6 import org.apache.struts.action.ActionForm;
 7 import org.apache.struts.action.ActionForward;
 8 import org.apache.struts.action.ActionMapping;
 9
10 public class LoginAction {
11     @override
12     public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
13         throws Exception{
14         // 通过ActionForm获取Request资源
15         UserActionForm userForm = (UserActionForm)form;
16         String userName = userForm.getName();
17         String password = userForm.getPassword();
18
19         //调用业务逻辑层处理
20         UserManage userManage = new UserManage();
21         User user = new user;
22         user.setName(userName);
23         user.setPassword(password);
24
25         // 验证信息——后面可以放在JSP中处理
26         // 转发到指定JSP页面
27         try{
28             userManage.ValidateUser(user);
29             return mapping.findForward("success");
30         }catch (UserNotFoundException e){
31             e.printStackTrace();
32             request.setAttribute("message", e.getMessage);
33         }catch (PasswordErrorException e){
34             e.printStackTrace();
35             request.setAttribute("message", e.getMessage());
36         }
37         return mapping.findForward("fail");
38     }
39 }

userActionForm:

 1 package com.jialin;
 2
 3 import org.apache.struts.action.ActionForm;
 4
 5 /**
 6  * 用户ActionForm ,负责收集表单数据
 7  * @author jialin
 8  *注:get和set后的字符串首字母变小写后,必须和表单中属性的名字一致
 9  */
10 public class UserActionForm extends ActionForm {
11     private String name;
12     private int password;
13     public String getName() {
14         return name;
15     }
16     public void setName(String name) {
17         this.name = name;
18     }
19     public int getPassword() {
20         return password;
21     }
22     public void setPassword(int password) {
23         this.password = password;
24     }
25
26 }

3. Model业务逻辑层

UserManage.java

 1 package com.jialin;
 2
 3 /**
 4  * MODEL层业务逻辑
 5  * @author jialin
 6  *判断用户是否合法
 7  */
 8 public class UserManage {
 9
10      public void ValidateUser(User user) {
11       // 判断用户名密码是否正确
12       if (!"jialin".equals(user.getName())) {
13           throw new UserNotFoundException("用户不存在!用户名为:" + user.getName());
14       } else if (user.getPassword() != 123456) {
15            throw new PasswordErrorException("密码错误");
16       }
17  }

4. 配置Struts:

1)拷贝struts相关的jar到WEB-INF/lib下
2) 在web.xml文件中配置ActionServlet

 1 <servlet>
 2         <servlet-name>action</servlet-name>
 3         <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
 4         <init-param>
 5             <param-name>config</param-name>
 6             <param-value>/WEB-INF/struts-config.xml</param-value>
 7         </init-param>
 8         <init-param>
 9             <param-name>debug</param-name>
10             <param-value>2</param-value>
11         </init-param>
12         <init-param>
13             <param-name>detail</param-name>
14             <param-value>2</param-value>
15         </init-param>
16         <load-on-startup>2</load-on-startup>
17     </servlet>
18
19
20     <!-- Standard Action Servlet Mapping -->
21     <servlet-mapping>
22         <servlet-name>action</servlet-name>
23         <url-pattern>*.do</url-pattern>
24     </servlet-mapping>

3) 提供struts-config.xml文件,需要放到WEB-INF下

 1 <?xml version="1.0" encoding="ISO-8859-1" ?>
 2
 3 <!DOCTYPE struts-config PUBLIC
 4           "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
 5           "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">
 6
 7 <struts-config>
 8      <!-- set ActionForm info-->
 9     <form-beans>
10         <form-bean name="userForm" type="com.jialin.UserActionForm" />
11     </form-beans>
12
13     <action-mappings>
14       <!-- Set path,action,actionform,scope,forward info -->
15         <action path="/login" type="com.jialin.LoginAction" name="userForm"
16             scope="request">
17             <forward name="success" path="/LoginSuccess.jsp" />
18             <forward name="fail" path="/LoginFail.jsp" />
19         </action>
20     </action-mappings>
21
22 </struts-config>

上述实现过程,其中ActionServlet的功能,被Struts封装了,所以我们的代码部分,并没有涉及到ActionServlet的部分。

分析代码可知道,Action不再需要我们手动创建,读取配置文件等基础服务已被Struts封装了,表单中数据类型也不需要我们手动转换了,页面转向可以进行配置,也不需要我们手动去配置文件中取了。

可以说,Struts把公共的服务为封装好了,我们只需要做很少的事,就可以获得很大的灵活性。

时间: 2024-08-05 07:04:03

Struts框架——(二)Struts原理with登录实例的相关文章

Java - Struts框架教程 Hibernate框架教程 Spring框架入门教程(新版) sping mvc spring boot spring cloud Mybatis

https://www.zhihu.com/question/21142149 http://how2j.cn/k/hibernate/hibernate-tutorial/31.html?tid=63 https://www.zhihu.com/question/29444491/answer/146457757 1. Java - Struts框架教程Struts 是Apache软件基金会(ASF)赞助的一个开源项目.通过采用JavaServlet/JSP技术,实现了基于Java EEWeb

SSH框架之Struts(1)——Struts的运行流程

对于采用Struts框架的Web应用,我们通过实例来介绍一下其基本流程. 一.实例 Login.jsp,进行系统登录的页面 <form action="login.do" method="post"> 用户:<input type="text" name="username"><br> 密码:<input type="password" name="pas

【SSH进阶之路】一步步重构MVC实现Struts框架——从一个简单MVC开始(三)

目录: [SSH进阶之路]Struts基本原理 + 实现简单登录(二) [SSH进阶之路]一步步重构MVC实现Struts框架--从一个简单MVC开始(三) [SSH进阶之路]一步步重构MVC实现Struts框架--封装业务逻辑和跳转路径(四) [SSH进阶之路]一步步重构MVC实现Struts框架--彻底去掉逻辑判断(五) [SSH进阶之路]一步步重构MVC实现Struts框架--完善转向页面,大功告成(六) 上篇[SSH进阶之路]Struts基本原理 + 实现简单登录(二),我们介绍MVC和

Eclipse搭建Struts框架,及一个简单的Struts例子

一.下载struts2.0.1 http://struts.apache.org/downloads.html,下载struts-2.0.1-all.zip,这个压缩包中包含了开发struts2所需的struts2-core.jar核心包以及其它struts2所依赖的JAR文件,另外还有一些struts2的示例程序以及一些HTML的API文档. 二.试用struts2.0.1 1. 新建一个WEB工程,将struts-2.0.1-all.zip压缩包中的lib目录下的所有jar文件拷贝到WEB工

【SSH进阶之路】一步步重构MVC实现Struts框架——彻底去掉逻辑判断(五)

目录: [SSH进阶之路]Struts基本原理 + 实现简单登录(二) [SSH进阶之路]一步步重构MVC实现Struts框架--从一个简单MVC开始(三) [SSH进阶之路]一步步重构MVC实现Struts框架--封装业务逻辑和跳转路径(四) [SSH进阶之路]一步步重构MVC实现Struts框架--彻底去掉逻辑判断(五) [SSH进阶之路]一步步重构MVC实现Struts框架--完善转向页面,大功告成(六) Struts的第二篇博客[SSH进阶之路]Struts基本原理 + 实现简单登录(二

【SSH进阶之路】一步步重构MVC实现Struts框架——完善转向页面,大功告成(六)

目录: [SSH进阶之路]Struts基本原理 + 实现简单登录(二) [SSH进阶之路]一步步重构MVC实现Struts框架--从一个简单MVC开始(三) [SSH进阶之路]一步步重构MVC实现Struts框架--封装业务逻辑和跳转路径(四) [SSH进阶之路]一步步重构MVC实现Struts框架--彻底去掉逻辑判断(五) [SSH进阶之路]一步步重构MVC实现Struts框架--完善转向页面,大功告成(六) 第四篇博客[SSH进阶之路]一步步重构MVC实现Struts框架--封装业务逻辑和跳

【SSH进阶之路】一步步重构MVC实现Struts框架——封装业务逻辑和跳转路径(四)

目录: [SSH进阶之路]Struts基本原理 + 实现简单登录(二) [SSH进阶之路]一步步重构MVC实现Struts框架--从一个简单MVC开始(三) [SSH进阶之路]一步步重构MVC实现Struts框架--封装业务逻辑和跳转路径(四) [SSH进阶之路]一步步重构MVC实现Struts框架--彻底去掉逻辑判断(五) [SSH进阶之路]一步步重构MVC实现Struts框架--完善转向页面,大功告成(六) Struts的第二篇博客[SSH进阶之路]Struts基本原理 + 实现简单登录(二

关于Struts框架简介

一,什么是框架? 所谓框架就是提供了一组统一的接口和编程方式的可以重用组件,同时我们可以在框架中扩充我们自己的特定逻辑. 二,MVC设计模式 将应用程序分为3个部分:模型 Model,视图View,控制器Controller: 模型组件:负责业务逻辑: 模型包含应用程序的核心功能.模型封装了应用程序的状态.有时它包含的唯一功能就是状态.它对视图或控制器一无所知. 视图组件:负责表示业务范围的视图: 视图提供模型的表示.它是应用程序的 外观.视图可以访问模型的读方法,但不能访问写方法.此外,它对控

commons-io在struts框架中无法获取upload.parseRequest(request)上传的文件解决方案

commons-io在struts框架中无法获取upload.parseRequest(request)上传的文件的主要原因是因为struts将request进行了封装,在文件上传时struts会将HttpServletRequest请求被转成了MultiPartRequestWrapper,所以如需使用request,则需要将struts封装好的的MultiPartRequestWrapper转换成HttpServletRequest,这里需要实行两部操作: 操作一:创建java类,继承Jak