二. 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:

 package com.jialin;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping; public class LoginAction {
@override
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
throws Exception{
// 通过ActionForm获取Request资源
UserActionForm userForm = (UserActionForm)form;
String userName = userForm.getName();
String password = userForm.getPassword(); //调用业务逻辑层处理
UserManage userManage = new UserManage();
User user = new user;
user.setName(userName);
user.setPassword(password); // 验证信息——后面可以放在JSP中处理
// 转发到指定JSP页面
try{
userManage.ValidateUser(user);
return mapping.findForward("success");
}catch (UserNotFoundException e){
e.printStackTrace();
request.setAttribute("message", e.getMessage);
}catch (PasswordErrorException e){
e.printStackTrace();
request.setAttribute("message", e.getMessage());
}
return mapping.findForward("fail");
}
}

userActionForm:

 package com.jialin;

 import org.apache.struts.action.ActionForm;

 /**
* 用户ActionForm ,负责收集表单数据
* @author jialin
*注:get和set后的字符串首字母变小写后,必须和表单中属性的名字一致
*/
public class UserActionForm extends ActionForm {
private String name;
private int password;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPassword() {
return password;
}
public void setPassword(int password) {
this.password = password;
} }

3. Model业务逻辑层

UserManage.java

 package com.jialin;

 /**
* MODEL层业务逻辑
* @author jialin
*判断用户是否合法
*/
public class UserManage {  public void ValidateUser(User user) {
   // 判断用户名密码是否正确
   if (!"jialin".equals(user.getName())) {
    throw new UserNotFoundException("用户不存在!用户名为:" + user.getName());
   } else if (user.getPassword() != 123456) {
    throw new PasswordErrorException("密码错误");
   }
 }

4. 配置Struts:

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

 <servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>2</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>2</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet> <!-- Standard Action Servlet Mapping -->
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>

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

 <?xml version="1.0" encoding="ISO-8859-1" ?>

 <!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd"> <struts-config>
<!-- set ActionForm info-->
<form-beans>
<form-bean name="userForm" type="com.jialin.UserActionForm" />
</form-beans> <action-mappings>
<!-- Set path,action,actionform,scope,forward info -->
<action path="/login" type="com.jialin.LoginAction" name="userForm"
scope="request">
<forward name="success" path="/LoginSuccess.jsp" />
<forward name="fail" path="/LoginFail.jsp" />
</action>
</action-mappings> </struts-config>

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

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

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

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

  1. struts框架的运行原理和流程

    从此图中简单描述一下struts2的运行流程:1.客户端请求一个HttpServletRequest的请求,如在浏览器中输入http://localhost: 8080/bookcode/Reg.ac ...

  2. 三大框架:Struts+Hibernate+Spring

    三大框架:Struts+Hibernate+Spring Java三大框架主要用来做WEN应用. Struts主要负责表示层的显示 Spring利用它的IOC和AOP来处理控制业务(负责对数据库的操作 ...

  3. 2018.11.11 Java的 三大框架:Struts+Hibernate+Spring

    ·定义:Java三大框架主要用来做WEN应用.Struts主要负责表示层的显示: Spring利用它的IOC和AOP来处理控制业务(负责对数据库的操作): Hibernate主要是数据持久化到数据库. ...

  4. Spring与Struts框架整合

    Spring与Struts框架整合 Struts,用Action处理请求 Hibernate,操作数据库 Spring,负责对象创建 Spring与Struts框架整合的关键点在与:让Struts框架 ...

  5. 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=6 ...

  6. struts(三)——struts框架实现登录示例

    前两篇讲解了struts框架的基本实现,自己感觉讲的也有些枯燥,今天拿登录的例子来做一个实现. 1.新建一个javaweb项目,并将struts的jar包拷贝到WebRoot/WEB-INF/lib下 ...

  7. struts(二)——struts框架实现的基本原理

    上一篇文章,我们介绍了MVC框架的基本原理,并指出了这个基本框架中存在大量if…else的问题.今天我们来介绍一下struts框架,让struts解决这个问题. 首先,看一下粗略的时序图: Actio ...

  8. 使用Struts框架,实现用户登陆功能

    前言:本篇文章是本人这周学习的一个小结,在自我总结的同时,希望也能够给其他同学带来一点帮助.本文主要知识是参照书本上的知识点以及网上其他博客文章,在上机操练后的所得,具体源码主要来自http://bl ...

  9. javaWeb项目(SSH框架+AJAX+百度地图API+Oracle数据库+MyEclipse+Tomcat)之一 基础Struts框架搭建篇

    即将开始着手写这个项目,所以希望通过这篇博客来记录自己学习的过程 今天开学第一天,就上了软件工程实践课,自己也开始着手做这个大作业了.首先我的项目名称叫做智能班车管理系统. 项目的概况: 该软件产品是 ...

随机推荐

  1. 解决oracle 中文入库是乱码的问题

    增加两个环境变量: LANG=zh_CN.GBK NLS_LANG  =  SIMPLIFIED CHINESE_CHINA.ZHS16GBK

  2. Oracle11g的安装方法

    一.win7 64位 只能装64位的服务端 装 32位的客户端 最后装PLSQL二.PLSQL 数据库没有值:(1)配置 C:\oracl\product\11.2.0\client_1\Networ ...

  3. Web前端工程师

    前端开发,不仅仅是需要会写页面而已,还需要具备很多技能,现做如下总结: 会点设计,不要求精湛,处理图片,设计个小广告是要的: 精通HTML+CSS,并能快速处理各浏览器兼容问题: 熟练掌握Javasc ...

  4. web----test-----selenium

    selenium ide 安装就自行百度吧. 对百度进行一个简单的录制. 1. 在Firefox浏览器打开百度页面. 2.在Firefox浏览器菜单栏中,选择“工具” ,选择selenium IDE ...

  5. 18.虚拟机linux上网问题

    1.1.VMware中虚拟机网络的三种设置第一种:桥接(bridged)第二种:NAT第三种:Host only .该模式下仅主机可以上网,虚拟机不能上网. 1.2.虚拟机上网方式1:NAT方式设置步 ...

  6. 修改APK包并push到system/app路径下安装

    在工作中,经常遇到需要修改apk包里的资源文件,达到检验不同配置下程序运行情况的目的. 过程如下: 1.首先连接手机,进入命令行,输入:adb root,使得adb获取root权限. 2.输入:adb ...

  7. SCN

    SCN 一.SCN的引入 众所周知,当oracle实例崩溃时,oracle通过检查点队列使用CKPT进程,周期性的将LRBA记入控制文件,以记录读取REDO LOG的范围.确定范围之后,oracle首 ...

  8. Python 3.X简史——记录3.0之后的重要更新

    Python 3.0在2008年12月3日正式发布,在之后又经历了多个小版本(3.1,3.2,3.3……),本文梳理Python 3.0之后的新特性. 其实每个版本都有大量更新,都写出来要几百页,这里 ...

  9. jquery change dropdownlist selected option

    <select name="corporation"> <option value="1">corporation1</optio ...

  10. 旋转机械中Pitch Change的经验

    针对CFX (Compound File EXplorer)中rotor-stator interface 网格的处理,Pitch Change方法提供了四种交接算法(intersection alg ...