Struts2框架基础篇

首先,要了解Struts2框架中参数传递的大体流程:

服务器端的Web容器收到用户的请求(URL)——Struts2的核心控制器FilterDispatcher接受用户发起的请求,然后判断这个请求是交给action还是交给web组件来处理;如果请求的action或web组件不存在,就会报错404。在整个处理过程中,需要一个辅助对象: ActionMapper ,它会确定调用哪个Action——相应的action会根据struts.xml的配置信息(首先执行拦截此action的所有拦截器,然后再执行请求的action对象;在这个处理过程中需要辅助对象:Action代理类ActionProxy)配置管理器(ConfigurationManager)——Action执行完毕之后,返回一个结果(此结果用字符串来表示),这个结果经过拦截Action的所有拦截器之后,返回给主控制器。主控制器根据此结果从配置文件中找到真正的路径,然后将请求转发给相应的视图。视图根据持久层作出相应的反应。整个参数传递的流程就结束了。

其次,导入Struts所需的jar文件。

Struts2要使用一些jar包文件,开发业务需求不一样,所需的包配置也不一样,以下这些包是最基本的,(一般情况下这些包也够用了),所需包的放置位置是\WebRoot\WEB-INF\lib:

其中

struts-core-2.jar 是Struts 2 框架的核心类库
  xwork-core.jar 是XWork类库,Struts 2 在其上构建
  ognl.jar 是 Object Graph Navigation Language , Struts 2 框架通过其读写对象的属性。
  freemarker.jar 是Struts 2 的UI标签的模版使用 Freemarker编写。
  commons-logging.jar 是ASF出品的日志包。
  commons-fileupload.jar 是文件上传组件。

导包完成后要创建Struts.xml,这是Struts 2 的核心配置文件,主要用于配置开发人员编写的action。

该配置文件通常放在src下,下面通过一个Struts.xml文件,详细分析一下这个核心配置文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

	<!-- package:包.structs2使用package来组织 name 属性:用于其他的包应用当前的包(必填属性) extends:当前包继承哪个包,继承的,即可用继承其中的所有的配置,通常情况下继承struts-default
		struts-default这个包在struts-default.xml文件中定义 namespace 属性是可选的,如果它没给出,则以“/”为默认值.若namespace有一个默认值,则要想调用这个包里的Action
		就必须把这个属性所定义的命名空间添加到有关的UR字符串中 -->
	<package name="helloworld" extends="struts-default">

		<!-- 配置一个action:一个struts2的请求就是一个action name:对应一个struts2的请求的名字,不包含扩展名 class:com.opensymphony.xwork2.ActionSupport
			method 默认值:execute -->

		<action name="product-input" class="com.opensymphony.xwork2.ActionSupport"
			method="execute">
			<!-- result:结果.表示action方法执行后可能返回一个结果,所以一个action节点可能会有多个result子节点. 多个result子节点使用name属性区分
				name:表示一个result 和action方法的返回值对应 默认值为success type:表示结果类型,默认值为dispatcher(转发到结果) -->
			<result name="success" type="dispatcher">/WEB-INF/pages/xxx.jsp</result>
		</action>

		<!-- class = "xxxx" 对应请求的包名加类名 -->
		<action name="product-save" class="xxxx" method="save">
			<result name="detais">/WEB-INF/pages/xxxx.jsp</result>
		</action>
	</package>
</struts>

在Struts 2中,Struts框架是通过Filter启动,在web.xml中必须有相应的配置:

<filter>
      <filter-name>struts2</filter-name>
      <filter-class>
          org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
      </filter-class>
  </filter>
  <filter-mapping>
      <filter-name>struts2</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping>

struts 2 在读取到 struts.xml的内容后,以javabean形式存放在内存中,以后Struts 2对每一次请求处理将使用内存中的数据。

Struts2提供了大量的数据校验器,有两种方法进行数据的校验:
1, 编码方式校验:
Action继承自ActionSupport,针对某个要进行校验的请求处理方法编写一个 public void validateXxx()方法,在方法内部进行表单数据校验.这种方法不提倡,和主代码容易造成代码混乱而且不易重用,需要为每个需要的地方加校验。
2,XML配置的方法校验:
针对要校验的Action类,在同包下编写一个名为:Action类名-validation.xml校验规则文件,这种是比较常用的,
命名规则:ActionName-validation.xml,其中ActionName是Action类的名字;
输入校验失败后,和类型转换一样,会将错误封装成fieldError,并放入Action Context中,因此在JSP中添加<s:fielderror/>可显示错误,此内容也是我们在数据校验文件中配置的;
例如:必填校验器
对登录用户名进行非空验证:

<validators>
        <!-- 需要验证的字段的字段名 -->
    <field name = "username">
        <field-validators type = "required">
            <!-- 错误提示信息 -->
            <message>请输入用户名</message>
        </field-validators>
    </field>
</validators>

年龄合法性验证:

 <validator type="int">
        <param name="fieldName">age</param>
        <param name="min">0</param>
        <param name="max">150</param>
        <message>年龄范围在0-150之间</message>
 </validator> 

日期验证(包括输入的是否 是date类型以及输入的日期是否合法)

<validators>
    <!-- 需要验证的字段的字段名 -->
    <field name = "date">
        <field-validators type = "date">
            <!-- 时间的最小值 -->
            <param name = "min">2000-01-01</param>
            <!-- 时间的最大值 -->
            <param name = "max">2017-05-04</param>
            <!-- 错误提示信息 -->
            <message>时间必须在2000-01-01至2017-05-04之间</message>
        </field-validators>
    </field>
</validators>


同时,struts2还提供了很多内置的校验器,可以直接使用:

1.required校验器
此校验器要求字段必须为非空;
 
2.requiredstring校验器
此校验器要求检验字符串非空并且必须长度大于0,即不能是""
可选参数为:
(1)trim:如果为true,则将前后的空白去掉,类似于String的trim函数;
 
3.int校验器
此校验器要求整数限定在一定范围之内;
可选参数为:
(1)min:最小值;
(2)max:最大值;
 
4.date校验器
要求日期在一定范围之内;
可选参数:
(1)min:最小日期;
(2)max:最大日期;
 
5.fieldexpression校验器
要求此校验器满足指定的逻辑表达式;
可选参数:
(1)expression:逻辑表达式;格式为:<![CDATA[(逻辑表达式)]]>
 
6.email校验器
要求字段一定要满足电子邮箱格式;
 
7.url校验器
要求字段格式满足URL格式;
 
8.stringlength校验器
要求字段是string,并且长度在一定范围之内;
可选参数:
(1)trim:删除前后空白;
(2)minLength:最小长度;
(3)maxLength:最大长度;
 
9.regex校验器
要求满足给定的正则表达式;
可选参数:
(1)expression:给出正则表达式;格式如:<![CDATA[(正则表达式)]]>
(2)caseSensitive:是否区分大小写;

例如,当我们要验证邮箱时,不需要自己做验证,

<validators>
    <!-- 需要验证的字段的字段名 -->
    <field name = "email">
        <field-validators type = "email">
            <!-- 错误提示信息 -->
            <message>邮箱地址无效</message>
        </field-validators>
    </field>
</validators>
时间: 2024-10-28 21:09:32

Struts2框架基础篇的相关文章

ES6 你可能不知道的事 - 基础篇

序 ES6,或许应该叫 ES2015(2015 年 6 月正式发布),对于大多数前端同学都不陌生. 首先这篇文章不是工具书,不会去过多谈概念,而是想聊聊关于每个特性 你可能不知道的事,希望能为各位同学 正确使用 ES6,提供一些指导. 对于 ES6,有些同学已经在项目中有过深入使用了,有些则刚刚开始认识他,但不论你是属于哪一类,相信这篇文章都有适合你的部分.针对文章中的问题或不同意见,欢迎随时拍砖.指正. 正文 Let + Const 这个大概是开始了解 ES6 后,我们第一个感觉自己完全明白并

Struts2框架学习之一:Hello World程序

前言 Struts2框架Apache基金组织下的一个开源框架,基于MVC模式设计的Web应用开发框架.Struts 2是一个用于开发Java EE网络应用程序的开源Web应用框架,它利用并扩展了Java Servlet API,鼓励开发者采用MVC架构.目前struts2的最高版本是2.5(测试版). 快速入门 1.下载和安装 可以从官网直接下载最新的struts开发包,官网有多个版本,使用的时候下载full版本即可.下载之后,只需要进行解压就可以使用了 2.Hello World程序 以下是建

java-测试Struts2框架时,两个除了名字不同外其他都一模一样的Action类,一个正常一个却报错

问题描述 测试Struts2框架时,两个除了名字不同外其他都一模一样的Action类,一个正常一个却报错 1,两个Action的xml配置中,namespace没有设为一样的,所以不是这方面的问题2,struts.xml中,我用的是引入外部配置文件,外部文件的名字是复制粘贴的,所以也不存在写错名字的问题3,既然其中一个Action可以运行,那么也排除了web.xml或server.xml这些配置文件忘设置,或者没有导包这样的问题 不解了-----------> 解决方案 name属性为每个pac

逆向工程恶意软件入门(基础篇)

本文讲的是逆向工程恶意软件入门(基础篇), 前言 在这个系列文章中,我会向大家介绍逆向工程恶意软件的各个方面的知识.逆向工程恶意软件是一个很深奥和复杂的主题,因此很少有人掌握它,这也是这个领域的薪酬很高的主要原因. 在开始本文之前,我需要先阐述一个概念框架,并阐述与逆向工程恶意软件有关的一些策略和问题. 什么是逆向工程? 在本系列文章中,即使我无法访问源代码(通常是这种情况),我也将尝试确定该恶意软件的功能.在确定软件功能之后,我将尝试对其调整或在另一个恶意软件中重新构建相关功能. 逆向工程用于

2000条你应知的WPF小姿势 基础篇&lt;22-27 WPF生命周期, 基础类等&gt;

原文:2000条你应知的WPF小姿势 基础篇<22-27 WPF生命周期, 基础类等> 端午长假在家陪着女朋友, 幸福感满满,生活对于一只饱经忧患的程序猿来说也是非常重要的,也就暂时没有更新博客.休假结束,回归奋斗的日子了,开始继续更新WPF系列. 在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C#  和 2,000 Things You Should Kn

Sql Server来龙去脉系列 必须知道的权限控制基础篇

原文:Sql Server来龙去脉系列 必须知道的权限控制基础篇     题外话:最近看到各种吐槽.NET怎么落寞..NET怎么不行了..NET工资低的帖子.我也吐槽一句:一个程序猿的自身价值不是由他选择了哪一门技术来决定,而是由他自身能创造出什么价值来决定.     在进入本篇内容之前,这里有几个问题:     1.一般程序猿都知道怎样创建.修改.登录账号,但知不知道登陆账号存储在哪个表或者视图?     2.数据库中其实存在登录账号和用户两个概念,你能解释清楚这两个概念吗?     3.对于

2000条你应知的WPF小姿势 基础篇&lt;8-14&gt;

原文:2000条你应知的WPF小姿势 基础篇<8-14> 在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师,对C#和WPF有着极深的热情.最为出色的是他维护了两个博客:2,000Things You Should Know About C#  和 2,000 Things You Should Know About WPF .听到博客名字就懂这个人有多伟大了吧.他以类似微博式的150字简短语言来每天更新一条WPF和C#重要又容易被遗忘的知识.Follow他的

浅析JS中对函数function的理解(基础篇)_javascript技巧

正文:我们知道,在js中,函数实际上是一个对象,每个函数都是Function类型的实例,并且都与其他引用类型一样具有属性和方法.因此,函数名实际上是指向函数对象的指针,不与某个函数绑定.在常见的两种定义方式(见下文)之外,还有一种定义的方式能更直观的体现出这个概念: var sum = new Function("num1", "num2", "return num1 + num2"); //不推荐 Function的构造函数可以接收任意数量的参

ASP.NET MVC小结之基础篇(二)_实用技巧

整理除了这个笔记,共享一下子,基本MVC的所有东西都介绍了,但是都是很基础的东西.本来打算一篇发表完的,但是发现东西有点多,所以分成了两篇文章,这是最后一篇了! 1.ASP.NET MVC请求过程 1 2.Controller (1) 控制器在ASP.NET MVC中扮演着处理客户端请求的角色 1)必须实现System.Web.Mvc.IController接口 ->通常直接继承System.Web.MVC.Controller类 2)必须要以Controller结尾 3)通过不同的Action