struts2的流程和一系列相关知识代码解析

1.客户端初始化一个指向servlet容器(Tomcat)的请求;

2.这个请求经过一系列的过滤器,接着FilterDispatcher被调用;

3.FilterDispatcher询问ActionMapper来决定这个请求是否要调用某个action;

4.如果ActionMapper决定调用某个Action,FilterDispatcher把请求的处理交给ActionProxy,ActionPro根据ConfigurationManager询问框架的配置文件,找到需要调用的Action类,一般都是读取struts.xml;

5.ActionProxy创建一个ActionInvocation的实例,ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器的调用;

6.一旦Action执行完毕,ActionInvocation根据struts.xml中的配置找到对应的返回结果

比如代码:

struts2获得了.action请求后,将根据部分决定调用哪个业务逻辑组件;

struts2应用中的Action都被定义在struts.xml中;

struts2用于处理用户请求的Action实例并不是用户实现的业务控制器,而是Action代理,因为用户实现的业务控制器并没有与ServletAPI耦合,显然无法处理用户的请求。

<html>
 <head>
  <title>SUCCESS</title>
 </head>
 <body>
  <form action="hello.action" method="post">
    USERNAME:<input type="text" name="name"></br>
    PASSWORD:<input type="password" name="pass"></br>
    <input type="submit" value="提交">
  </form>
 </body>
</html>

比如上面表单的hello.action,这个action属性不是一个普通的servlet,也不是一个动态JSP页面,当表单提交给hello.action时,Struts2的FilterDispatcher将会起作用,将用户请求转发到对应的Action.

注意的是:Struts2 Action默认拦截所有后缀为.action的请求,如果我们需要将表单提交给Action处理,则应将表单action属性设置为.action的格式。

控制器类

public class HelloAction {
	private String name;
	private String pass;
	public void setName(String name){
		this.name=name;
	}
	public void setPass(String pass){
		this.pass=pass;
	}
	public String execute(){
		if("yang".equals(name) && "1234".equals(pass)){
			return "success";
		} else{
			return "error";
		}
	}
}

前面执行完成后仅仅是执行了页面的转发,没有跟踪用户的状态,当用户登录完成后,我们需要将用户的用户名添加为HTTPSession的状态信息。

为了访问Httpsession实例,struts2提供了一个ActionContext类,该类提供了一个getSession()得方法,但是这个方法的返回值不是HttpSession()而是Map(),但是Struts2的拦截器会负责该Session()和HttpSession()之间的切换。

为了检查我们设置的session属性是否成功,可以给成功后的界面这么设置

<html>
 <head>
  <base href="<%=basePath%>" rel="external nofollow" >
  <title>SUCCESS</title>
 </head>
 <body>
  欢迎,${sessionScope.user},您已经登录。
 </body>
</html>

利用JSP2.0表达式语法输出HTTP Session中的user属性。

Action 工具类集成ActionSupport

ActionSupport类是一个工具类,而且已经实现了Action接口,除此之外,还实现了Validateablez接口,提供了数据校验功能。

为了增加输入数据的校验功能,在Action中增加重写validate方法。

public void validate() {
	if(getName()==null || getName().trim().equals("")){
		addFieldError("name",getText("name.required"));
	}
	if(getPass()==null || getPass().trim().equals("")){
		addFieldError("pass", getText("pass.required"));
	}
}

上面添加的重写的validate方法会在系统的execute()方法之前执行,如果执行该方法后Action类的fieldError中已经包含了数据校验错误,请求将被转发到input逻辑视图处,所以还要在struts.xml中添加input逻辑视图名,让其跳转到登录页面。

这个validate方法的缺点就是需要大量重写validate方法,所以可以用struts2的校验框架进行校验。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
  "-//OpenSymphony Group//XWork Validator 1.0.3//EN"
  "http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd">
<validators>
<!--验证表单name-->
  <field name="name">
    <field-validator type="requiredstring">
      <message key="name.required"/>
    </field-validator>
  </field>
  <!--验证表单pass-->
  <field name="pass">
    <field-validator type="requiredstring">
      <message key="pass.required"/>
    </field-validator>
  </field>
</validators>

总结

以上就是本文关于struts2的流程和一系列相关知识代码解析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

(0)

相关推荐

  • Struts2相关的面试题整理分享

    前言 众所周知,Struts2是个非常优秀的开源框架,我们能用Struts2框架进行开发,同时能快速搭建好一个Struts2框架,但我们是否能把Struts2框架的工作原理用语言表达清楚,你表达的原理不需要说出底层是怎么实现的,我估计大多数的人也听不懂.当面试官问到我们Struts2的工作原理时,我们该怎么回答这个问题呢?回答什么才能让自己说的与众不同,先看看其他朋友总结的 一.工作原理 在Struts2框架中的处理大概分为以下几个步骤 1 客户端初始化一个指向Servlet容器(例如Tomca

  • 基于struts2和hibernate实现登录和注册功能

    本文实例为大家分享了struts2和hibernate实现登录和注册功能,供大家参考,具体内容如下 1.该项目使用MySQL数据库,数据库名为test,表名info,如图所示: 2.配置web.xml(Struts2使用) <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/jav

  • struts2框架的登录制作图文教程

    首先:我们要建一个web项目 接着: 我们先来导入struts的xml文件 第一步:右击你的项目名,鼠标到MyEclipse会看到一个add struts开头的文件,点开以后看到: 这里我们选择struts2.版本,并且路径我们选择 /*  ,因为我们只是简单的登录,所以直接finish. 实体类我们就不写了 ,来看一下关于struts的核心类 aciton的编写. 实现action有两种方法: 1:实现action接口, 2:继承actionsupport类 这里我实现actionsuppor

  • Struts2 的国际化实现方式示例

    以前一直看见 i18N ,现在才知道原来 i18N 就是 Internationalization,因为以 i 开头,以 N 结尾,共18个字母,也就是国际化的意思.在百度搜索主页上没有看见中英文的切换,毕竟百度在中国是为了中国人而设计的,没必要弄个英文的切换.google搜索主页上是有的,因为谷歌在中国的服务器放到了香港,所以还有繁体切换.这是怎么做到的呢?其实原理很简单,用Struts2很容易实现的.以实现中英文切换为例做一下说明: 第一步:在src目录下添加两个资源文件,命名方式很重要的.

  • struts2的国际化实现网站整体中英文切换实例代码

    本文介绍了struts2的国际化实现网站整体中英文切换实例代码,分享给大家,具体如下: 环境要求:Struts2框架环境搭建成功 为了实现程序的国际化,必须先提供程序所需要的资源文件.资源文件的内容基本是key-value对,其中key是程序使用的部分,而value是程序的显示部分. 资源文件的命名可以是如下3种形式: baseName_language_country.properties baseName_language.properties baseName.properties 其中b

  • Struts2拦截器Interceptor的原理与配置实例详解

    一.Struts2拦截器原理: Struts2拦截器的实现原理相对简单,当请求struts2的action时,Struts 2会查找配置文件,并根据其配置实例化相对的    拦截器对象,然后串成一个列表,最后一个一个地调用列表中的拦截器. 比如:应用要求用户登陆,且必须为指定用户名才可以查看系统中某个视图资源:否则,系统直接转入登陆页面.对于上面的需求,可以在每个Action的执行实际处理逻辑之前,先执行权限检查逻辑,但这种做法不利于代码复用.因为大部分Action里的权限检查代码都大同小异,故

  • Struts2框架初学接触

    Struts2以WebWork优秀的设计思想为核心,吸收了 Struts框架的部分优点,提供了一个更加整洁的MVC设计模式实现的Web 应用程序框架. Struts2引入了几个新的框架特性:从逻辑中分离出横切关注点的拦截器.减少或者消除配置文件.贯穿整个框架的强大表达式语言.支持可变更和可重用的基于MVC模式的标签API, Struts2充分利用了从其它MVC框架学到的经验和教训,使得 Struts2框架更加清晰灵活. 今天写一篇Struts2框架的,在很久很久以前,Struts2可谓是称霸江湖

  • Struts2实现对action请求对象的拦截操作方法

    Struts2的核心功能是action,对于开发人员来说,使用Struts2主要就是编写action,action类通常都要实现com.opensymphony.xwork2.Action接口,并实现该接口中的execute()方法. 该方法如下:   public String execute() throws Exception Struts2并不是要求所有编写的action类都要实现Action接口,也可以直接编写一个普通的Java类作为action,只要实现一个返回类型为String的无

  • struts2的流程和一系列相关知识代码解析

    1.客户端初始化一个指向servlet容器(Tomcat)的请求: 2.这个请求经过一系列的过滤器,接着FilterDispatcher被调用: 3.FilterDispatcher询问ActionMapper来决定这个请求是否要调用某个action: 4.如果ActionMapper决定调用某个Action,FilterDispatcher把请求的处理交给ActionProxy,ActionPro根据ConfigurationManager询问框架的配置文件,找到需要调用的Action类,一般

  • Java IO流相关知识代码解析

    一.IO流的分类 字符流 Reader InputStreamReader(节点流) BufferedReader(处理流) Writer OutputStreamWriter(节点流) BufferedWriter(处理流) PrintWriter 字节流 InputStream FileInputStream(节点流) BufferedInputStream(处理流) ObjectInputStream(处理流) PrintStream OutputStream FileOutputStre

  • Java 内省introspector相关原理代码解析

    1. JavaBean (有get/set属性,和默认构造器等规范的java类) import java.util.Date; public class Student { // 这是 字段 private String name; private int age; private Date birthday; // 这是 属性 //(get.set开头的方法,getName.setName算一个属性,单独一个set或get也算一个属性) // 属性名为 去掉get.set后 第一个大写字母变小

  • Python Matplotlib绘图基础知识代码解析

    1.Figure和Subplot import numpy as np import matplotlib.pyplot as plt #创建一个Figure fig = plt.figure() #不能通过空figure绘图,必须使用add_subplot创建一个或多个subplot #图像为2x2,第三个参数为当前选中的第几个 ax1 = fig.add_subplot(2, 2, 1) ax2 = fig.add_subplot(2, 2, 2) ax3 = fig.add_subplot

  • K近邻法(KNN)相关知识总结以及如何用python实现

    1.基本概念 K近邻法(K-nearest neighbors,KNN)既可以分类,也可以回归. KNN做回归和分类的区别在于最后预测时的决策方式. KNN做分类时,一般用多数表决法 KNN做回归时,一般用平均法.  基本概念如下:对待测实例,在训练数据集中找到与该实例最邻近的K个实例(也就是上面所说的K个邻居), 这K个实例的多数属于某个类,就把该输入实例分类到这个类中 2. KNN算法三要素 KNN算法主要考虑:k值的选取,距离度量方式,分类决策规则. 1) k值的选取.在应用中,k值一般选

  • Java游戏服务器系列之Netty相关知识总结

    一.简介 Java的底层API逐渐复杂,而开发者面对的开发场景需求也在逐渐增大.如果直接针对底层API进行编程,无疑是耗时耗力的.这时就催生了极多的编程框架,这些框架隐藏了API实现的复杂细节,以最简洁的方式给开发人员提供功能的实现接口.Netty就是一款针对于网络链接的框架,他的出现让服务器开发人员更加的集中关注于更多逻辑的实现,而不为了实现更好更多更稳定的链接而头疼.Netty的核心功能基于NIO实现. 二.Netty的应用场景 几乎适用于所有的长短链接场景,由于Java应用的广泛性,几乎所

  • Java基础之并发相关知识总结

    一.Java并发是什么? 用学术定义来说就是 并发:同一时间段,多个任务都在执行 (单位时间内不一定同时执行): 简单来说就是,同一个时间段,让计算机同时做多个事情. 说到并发,不得不提就是并行: 并行:单位时间内,多个任务同时执行. 两者大眼一看很像,仔细一想却并不相同,因为并行强调某个时间点多个任务同时执行,而并发强调的是一个时间段内多个任务都在执行. 二.怎么做? 大部分并发问题,最终都可以抽象成三类问题分工.同步和互斥.而且针对不同的问题有着不同的方式来解决,具体如下图所示: 三.分工

  • Android字体相关知识总结

    目录 一.Android 默认字体介绍 1.Android 系统默认使用的是一款叫做 Roboto 的字体,这也是 Google 推荐使用的一款字体 传送门.它提供了多种字体形式的选择,例如:粗体,斜体等等. 2.在 Android 中,我们一般会直接或间接的通过 TextView 控件去承载字体的显示,因为关于 Android 提供的承载字体显示的控件都会直接或间接继承 TextView,例如:EditText,Button 等等,下面给出一张 TextView 继承图: 3.TextView

  • 简单说说JVM堆区的相关知识

    一.堆概述 一个jvm实例(进程)只存在一个堆内存,堆也是java内存管理的核心区域. java 堆区在jvm启动时即被创建,其空间大小也就被确定了 <java虚拟机规范>规定,堆可以处于物理上不连续的内存空间,但在逻辑上它应该被称为连续的 所有线程共享java堆,在这里和可以划分线程私有的缓冲区(tlab) 所有对象实例以及数组都应在运行时分配在堆中 方法结束后,堆中的对象不会马上被移除,仅仅在垃圾收集时候才会被移除 堆是gc执行垃圾回收的重点区域 1.1 堆内存细分 现代垃圾收集器大部分基

  • 总结python多进程multiprocessing的相关知识

    multiprocessing多进程 概念 创建多进程基本流程 创建进程对象 启动进程 回收进程 代码: import multiprocessing as mp from time import sleep # 进程执行函数 def fun(): print("开始一个进程") sleep(3) print("进程结束") # 创建进程对象 p = mp.Process(target = fun) p.start() # 启动进程 p.join() # 回收进程

随机推荐