Java开发必会框架Struts2第二天

一、封装请求正文到对象中(非常重要)

1、静态参数封装

在struts.xml配置文件中,给动作类注入值。调用的是setter方法。

原因:是由一个staticParams的拦截器完成注入的。

2、动态参数封装:开发时用到的

通过用户的表单封装请求正文参数。

2.1、动作类作为实体模型

实体模型:Entity,对应数据库中表的记录(注意类对应的是表结构,而对象对应的是一条记录)

原因:是由params拦截器完成的。

2.2、动作类和实体模型分开

问题:

由于我们没有初始化user对象,默认为null,一调用setUser方法,就空指针异常了。但是框架却封装进去值了。

原因:

通过执行过程:

2.3、模型驱动:建立动作类和模型分开的前提下(开发中采用的方式)

此处的学习目标:目前先记住怎么写,要想理解,必须等讲完OGNL表达式之后。

原因:是由一个modelDriven拦截器做的。

二、用户注册案例(重点)

1、数据建模(实体模型和数据库)

2、建立业务层接口

3、建立持久层接口

4、数据源工具类

5、表现层使用Struts2框架实现

5.1、动作类:

5.2、配置文件

5.3、注册界面和结果视图

注册界面:

结果视图:

三、数据类型的转换(明白原理,实际开发中几乎不用)

1、开发中的情况:

实际开发中用户通过浏览器输入的数据都是String或者String[]。

String/String[]————填充模型(set方法)————>POJO(plain old java object) pojo中有java的数据类型。

POJO————————获取(get方法)————>页面展示:String

2、类型转换情况

写数据:(增,删,改)都是String或String[]数组转换为其他类型。

读数据:(查)其他类型转换为String。

3、Struts2提供的常用类型转换

a.基本数据类型自动转换。

b.日期类型:默认按照本地日期格式转换(yyyy-MM-dd)。

c.字符串数组:默认用逗号+空格,连接成一个字符串。

4、自定义类型转换器(知道)

示例:把日期格式按照 MM/dd/yyyy的格式转换

4.1、Struts2中的类型转换器结构:

4.2、编写类型转换器(编写一个类继承StrutsTypeConverter,实现抽象方法)

4.3、注册类型转换器

局部类型转换器:只能指定javabean中的属性用

按照属性来注册。在属性所属的javabean的包下建立一个.properties文件。文件名称:javabean名称-conversion.properties

全局类型转换器:(推荐)

按照要转换的数据类型来注册。

at the top op classpath,建立一个固定名称xwork-conversion.properties的属性文件。

5、转换失败后的处理(需要掌握)

当转换失败后,页面提示:

解决办法:配置回显结果视图

问题:

配置了回显视图后,当转换失败时,可以回到请求页面,但是表单数据都没了?

显示错误提示:借助Struts2的标签库。

回显数据:使用struts2的标签库生成表单。(建议使用)

错误信息中文提示:使用的是struts2的国际化。

问题:

类型转换器当转换失败后,如何进入input视图的?

原因:

是由一个叫做conversionError的拦截器完成的。

四、数据验证

用户的输入验证,必须做,且工作量巨大。

1、验证的方式

客户端验证:javascript

服务端验证:逻辑验证(我们的代码)

注意:如果客户端和服务端二选一的话,服务器端的不能省。

实际开发中:客户端+服务端

2、Struts2的服务端验证

2.1、编程式验证

前提:

动作类必须继承ActionSupport

在代码中编写验证规则。

a、针对动作类中的所有动作方法进行验证:

在动作类中覆盖public void validate()方法。

但是当我们再写一个动作方法时:

由此可知,该验证方法会对动作类中的所有动作方法进行验证。

b、针对动作类中的某个动作方法进行验证

针对上面的问题,解决办法1:给不需要验证的动作方法添加一个@SkipValidation注解。

解决办法2:validation方法遵守书写规范。

解决办法1和解决办法2的使用时机:需要验证的动作方法少,用解决办法2。需要验证的方法多,用解决方式1。(简单一点:挑少的写)

所有编程式验证的弊端:硬编码。

2.2、声明式验证(推荐)

通过编写验证规则的xml文件。需要验证时,编写xml文件,不要验证,就不写。

优势:解决了2.1编程式验证的弊端

a、针对动作类中的所有动作进行验证:在动作类所在的包中,建立一个ActionClassName-validation.xml的文件,内容如下:

注意:它是针对动作类中的所有动作方法。

b、针对动作类中的某个动作进行验证:在动作类所在的包中建立一个xml文件,名称为ActionClassName-ActionName-validation.xml。内容如下:

它是针对指定动作方法进行验证:

2.3、Struts2内置的常用声明式验证器

2.3.1位置:

xwork-core-2.3.15.3.jar\com\opensymphony\xwork2\validator\validator\default.xml

2.3.2、验证器注入参数

例如:我们使用requiredstring,默认是去空格,当我们不想去空格时,就可以给验证器注入参数。

基于字段的:

另一种基于验证器的:

3、常用验证器示例

运行结果:

五、国际化概念(了解)

1、什么是国际化

软件的国际化:软件开发时,要使它能同时应对世界不同地区和国家的访问,并针对不同地区和国家的访问,提供相应的、符合来访者阅读习惯的页面或数据。

2、什么需要国际化

程序:需要国际化。

数据:是什么样的就是什么样的。

比如:

用户注册的表单,有用户名,密码这5个汉字,在zh_CN语言环境,显示的就是用户名和密码。但是在en_US语言环境,显示的就应该是username和password。这就是程序。

用户名输入的是【张三】,密码输入的是【test】,那无论在什么语言环境都应该是是【张三】和【test】。这就是数据。

3、固定文本的国际化

例如:消息提示,错误提示和菜单,导航栏等等固定文本。

步骤:

3.1、创建一个消息资源包

一个资源包由多个文件组成,这些文件名都有命名规范:主要文件名_语言代码_国家代码.properties。 语言代码:由iso规定的。国家代码:有iso规定的

当文件只有主要文件名.properties时,表明它是默认资源包。浏览器会根据不同的语言环境找对应语言环境的资源包,当没有时,找默认的。

每个资源包的内容都由相同的key和对应语言环境的value组成。

比如:

message_zh_CN.properties message_zh_HK.properties message_en_US.properties

3.2、读取资源包中的内容

jsp中使用国际化:

使用jstl的fmt标签:

六、Struts2中的国际化(了解)

1、Struts2中使用国际化的前提

首先,我们要知道,在Struts2中,所有的消息提示都是基于国际化的。

其次,要想在Struts2中使用国际化,动作类必须继承ActionSupport类。

2、Struts2中使用国际化

2.1、配置资源包

a、配置全局资源包

b、配置包范围的资源包

资源包名称命名规范:package_语言代码_国家代码.properties(固定的)。以此种命名方式的资源包能被该包及其子包中的动作类访问。

优先级:高于全局消息资源包

c、局部消息资源包(只为动作类来使用的)

资源包名称命名规范:动作类名称_语言代码_国家代码.properties。以此种命名方式的资源包,只为动作类服务。

优先级最高(就近原则)。

Struts2中资源包的搜索顺序:

2.2、读取资源包的内容

a、动作类中的读取方式(实际开发中几乎从来不用)

b、在页面中读取资源包内容

直接访问jsp:

通过动作类访问jsp

c、自由指定读取资源包

原文发布于微信公众号 - Java帮帮(javahelp)

原文发表时间:2017-02-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏屈定‘s Blog

Maven仓库清理脚本

工作中本地maven仓库随着项目增多会变得越来越大,看着心烦,于是想着清理. 没有发现很好的清理策略,只能从文件以及文件夹修改时间上入手,修改时间小于指定时间的...

43730
来自专栏ionic3+

【Appetite】ionic3实录(五)基本服务实现

前面章节基本把应用的总体配置完成了,开始进入具体页面的开发,而这些离不开与数据的交互、与用户的反馈操作等。正所谓“兵马未动,粮草先行”,现在封装下基本的服务。

12240
来自专栏决胜机器学习

设计模式专题(十)——观察者模式

设计模式专题(十)——观察者模式 (原创内容,转载请注明来源,谢谢) 一、概述 观察者模式(Observer),又称做发布-订阅模式(Publish/Subs...

36890
来自专栏张戈的专栏

Linux运维工程师:30道面试题整理

前段时间,我在准备面试的时搜到的一套 Linux 运维工程师面试题,感觉比较全面,一直保存在草稿,刚在整理后台时翻了出来,干脆就发出来好了,以备不时之需。 1....

2.3K50
来自专栏程序员互动联盟

【专业技术】Android安全嘛?

安卓有一套自己的安全权限机制,大部分来自linux的权限机制,某些地方也做了延伸,比如linux中的用户概念,在安卓上来说就相当于app。对于一些刚学习安卓的同...

42090
来自专栏木子墨的前端日常

nginx反向代理跨域基本配置与常见误区

最近公司前后端分离,前端独立提供页面和静态服务很自然的就想到了用nginx去做静态服务器。同时由于跨域了,就想利用nginx的反向代理去处理一下跨域,但是在解决...

28430
来自专栏李家的小酒馆

struts2面试整理

struts2的工作原理 客户端发送请求 经过一系列的过滤器 FilterDispatcher通过ActionMapper来决定这个REquest需要调用的Ac...

20300
来自专栏拂晓风起

Spring 获取web根目录 (Spring线程获取web目录/路径/根目录,普通类获取web目录)

11130
来自专栏安恒网络空间安全讲武堂

技术分享 | 深入分析APPCMS<=2.0.101 sql注入漏洞

目录 0x00 前言 0x01 漏洞分析--代码审计 0x02 漏洞利用 1.sql注入出后台账号、密码、安全码 2.二次漏洞利用:sql注入+csrf...

43180
来自专栏小白安全

分享几个绕过URL跳转限制的思路

大家对URL任意跳转都肯定了解,也知道他的危害,这里我就不细说了,过~ 大家遇到的肯定都是很多基于这样的跳转格式 http://www.xxx.x...

87260

扫码关注云+社区

领取腾讯云代金券