配色: 字号:
Struts2要点学习
2015-08-17 | 阅:  转:  |  分享 
  
在MVC流程中,有一些操作是每次都要做,而且这些操作是通用

1.通过request.getParameter得到请求参数

2.将请求参数进行类型转换

3.数据输入校验

4.文件上传

。。。。。。



框架:在N个项目中通用的,重复性的代码“抽取”出来,组成一个“类库”



我们为什么要使用开源框架?

为什么要学习Struts2?

为什么我们不自己写一个框架?

1.使用的人少,测试的机会少,有很多未知的错误和bug

2.技术实力没有别人强



MVC框架:

Struts2

SpringMVC

JSF(Sun公司推荐的MVC规范)



Struts2历史:

2001年,有一个Java大神写了Struts1(全世界第一个MVC框架)



捐献给了Apache(开源组织)



开源的其他的MVC框架,WebWork(2003)(XWork+Web前端)

由于出身不好,作者不够有名

开源OpenSymphony(OS)已经解散

2007年,由WebWork分化出了Struts2

2011年,OS解散



/

.jar —— N个.class文件 方便管理一堆.class文件

.war —— 一个Web应用的包

.ear —— 一个企业应用包 包含N个jar包和N个war包

这些包都是用jar命令来压缩的,和zip文件格式是兼容

/



======================使用Struts2================

1.下载Struts2的框架文件

Struts2解压之后,得到4个文件夹

apps:包括5个war包

struts2-blank.war——Struts2空应用

struts2-rest-showcase.war——Struts2中REST技术的例子

struts2-showcase.war——Struts2中的小例子

docs:API文档

lib:Struts2的jar包,以及编译和运行所需要的第三方jar包

src:Struts2的源代码



==================安装Struts2===================

1.考jar包(全考过来是错的)

apps\struts2-blank.war\WEB-INF\lib下所有的jar包

2.修改web.xml文件,加载Struts2核心Filter

让核心Filter过滤所有的用户请求

3.在classes目录下增加一个Struts2的配置文件

把struts.xml文件放在src目录下即可



===================Struts2开发步骤==================

1.先定义一个能发送请求的页面,

可以是超链接,也可以是表单

2.开发Action

Struts2对Action要求很低

A.Action实现Action接口,或者是继承ActionSupport类

ActionSupport也实现了Action接口

B.为每个请求参数都提供Field,并提供相应的setter和getter方法

C.该Action类应该有无参数的构造方法

3.配置Action类

==================如何在Action中访问ServletAPI====================

总有些时候,我们需要访问ServletAPI

比如我们需要把数据存入到session

Struts2提供关了两种方式访问ServletAPI

伪访问:借助于ActionContext

提供了getSession() --模拟访问session

提供了getApplication() --模拟访问application

真访问:借助于ServletActionContext

-staticPageContextgetPageContext()

-staticHttpServletRequestgetRequest()

-staticHttpServletResponsegetResponse()

-staticServletContextgetServletContext()

常量配置:

Struts2常量,也叫Struts2属性——控制整个Struts2应用的特性

形式:常量名对应常量值

配置常量有3种方式:

1.在we.xml中(需要4行)





常量名

常量值



2.在Struts.xml中,每一行配置一个常量



3.额外增加一个struts.properties文件

常量名=常量值(name=value)每行配置一个

常用常量:

struts.devMode=true

-设置是否处于开发模式,开发模式提示更多错误信息

自动重新加载配置文件,开发模式为true

struts.i18n.encoding=utf-8

-设置编码字符

struts.action.extension=do

-设置action默认的后缀名,默认值是action

strutsserve.staticbrowerCache

-设置浏览器是否缓存静态内容,开发阶段设置false,运行阶段true

struts.i18n.reload

-设置是否每次请求都重新加载资源文件

struts.configuration.xml.reload

-设置是否每次struts.xml修改之后,应自动重新加载

struts.custom.i18n.resources

-加载国际化资源文件

======================包配置=========================

企业开发——模块化开发

——开发阶段:安全,每个人都维护自己的配置文件

——销售阶段:软件做成模块化(可以模块化销售)

配置包:

每个package标签定义了一个包的配置

-name:必填,指定了包的名字,该名字是该包被其他包引用时使用key

-namespace:可选,定义包的命名空间

-extends:可选,继承其他包,可以继承action

-abstract:可选,定义一个抽象包(抽象包里不能包含action)

结果配置:Action中处理用户请求的方法

1.方法不能有形参

2.返回值必须是String



之前学习的ServletMVC

(1)调用Model方法之后,跳转页面的地址硬编码

(2)导致程序在以后需要维护、修改时候非常麻烦,必须手动修改源代码

Struts2的做法:

1.Action调用业务逻辑层方法后,返回一个String类型的“逻辑视图名”

2.通过struts.xml文件中

定义了逻辑视图名

真实的物理视图

标准的result标签











全局结果





...



顺序:先扫描action内部的result,如果没有匹配的result,才扫描全局结果

动态方法调用(DMI-dynamicmethodinvoke)

用处不大,大致了解下

在提交请求的时候,直接提交给action指定的方法处理

在页面上指定请求的地址:action名!方法名

LoginAction!loginUser

为什么少用:

1.动态方法调用安全性不高

2.其实完全可以用action标签中的method属性来指定方法名

=======================国际化========================

程序国际化(i18n-internationalization)

程序可以根据机器所在的国家、语言环境,自动显示当前国家、语言的内容

国际化的本质:查找、替换

国际化的步骤:

1.为不同的国家,语言环境提供资源文件

如果在资源文件中出现了非西欧字符,要使用native2ascii命令处理该文件

2.在程序中输出的是国际化消息的key

Struts2国际化

1.支持模块化加载

2.支持自动加载国家化资源文件

1.JSP页面的国际化

a.需要手动的加载国际化消息

使用需要国际化的页面部分

b.在页面上显示文字使用

如果是在表单元素中实现国际化,使用“key”属性指定国际化消息的key

2.Action的国际化

a.自动加载资源文件

让国际化消息资源文件的baseName与Action的类名相同

而且要放在同一个包中

b.在Action类中要继承ActionSupport,使用getText()方法用来加载国际化消息

3.包范围内的国际化

a.自动加载

让国际化消息资源文件baseName为package

4.全局的国际化资源文件

a.struts.custom.i18n.resources常量来加载国家化资源文件

=================Struts2的异常处理================

try{

//业务代码

}catch(xxxExceptione){

//处理xxx异常的代码

forward(a.jsp)

}catch(yyyExceptione){

//处理yyy异常的代码

forward(b.jsp)

}

对于Action的处理方法,处理结果可能有两种情况:

1.正常执行结果,会返回一个String的逻辑视图

2.遇到异常,返回一个异常





/WEB-INF/content/a.jsp

/WEB-INF/content/b.jsp











Struts2异常配置的本质:

为不同的异常类:“起一个”逻辑视图名

Struts2设计的处理方法完全不需要处理任何异常,可以声明抛出异常

=====================OGNL===================

在JSP学过EL表达式:访问数据的工具

${requestScope.abc}

OGNL-对象图导航语言(Object-CraphNavigationLanguage)

要访问数据,就得有“StackContext”容器

——可以理解为一个Map集合

1.它里面的每个对象,都应该有个名字,根据名字来访问对象

使用#访问

假如OGNLContext中有三个对象:foo,bar,test

#bar.abc-访问bar对象中的getAbc()返回值

#test.xyz.abc.def-访问test对象中的getXyz().getAbc().getDef()返回值

2.OGNLContext中有一个根(root)对象

如果我们要访问根(root)对象,可以省略对象名

假如OGNLContext中有三个对象:foo,bar,test其中foo是根对象

abc.xyz.def

contextmap:

1.application

2.session

3.valuestack(root)

4.request

5.parameters

6.attr(依次搜索page/request/session/application)







3.OGNL创建List集合对象

{obj1,obj2,obj3,obj4......}

4.OGNL创建Map集合对象

#{key1:value1,key2:value2,key3:value3......}

5.OGNL可以获取指定集合的子集合

person.cats相当于调用了person.getCats()

-获取person所养的猫的集合

person.cats.{?#this.age>2}-获取person所养的猫的age大于2的所有猫

person.cats.{^#this.age>2}-获取person所养的猫的age大于2的第一个猫

person.cats.{$#this.age>2}-获取person所养的猫的age大于2的最后一个猫

6.OGNL还支持直接调用静态方法和属性

-需要将struts.ognl.allowStaticMethodAccess常量设置为true才可以

类名@静态属性

类名@静态方法(参数列表)

控制标签:

if/elseif/else 分支结构

test属性指定要判断的条件

迭代集合

iterator value属性指定被迭代的集合,被迭代的集合通常用OGNL表达式指定

如果不指定value属性,迭代ValueStack栈顶的集合

status属性指定将迭代对象的IteratorStatus对象以该名称存入到StackContext中

通过该对象可判断当前迭代元素的属性

begin属性指定一个索引值,指定从该索引对应的元素开始迭代,默认值是0

end属性指定一个索引值,指定迭代到该索引值对应的元素结束

默认值集合元素个数-1

step属性指定迭代集合元素的步长(增量)

append/merge 把两个或两个以上的集合合并成新的集合

var属性指定新集合的名字

标签内可以写多个

append效果:abcABC(集合1:abc集合2:ABC)

merge效果:aAbBcC

generator 按某种规则把字符串分割成一个集合

separator属性指定用于解析分割字符串的分隔符

var指定被解析的字符串

var将生成的Iterator对象以该名称放入StackContext

subset 截取子集合

source指定源集合,如果不知道,默认取得ValueStack栈顶元素

start指定子集合从源集合的第几个元素开始截取,默认值0

count指定子集元素的个数,默认取得源集合中的所有元素

sort 对集合元素进行排序

comparator属性指定进行排序的Comparator对象

source属性指定被排序的集合

数据标签:

set 定义一个变量

property 输出指定表达式的值

value属性指定表达式,然后输出该表达式的值

如果不指定value属性,输出ValueStack栈顶的值(栈:后进先出)

bean 创建一个bean对象,var指定对象名,name指定类型

i18n 为指定页面加载国际化资源文件,name指定国际化资源文件的baseName

text 输出国际化消息,通过name属性指定国际化消息的key

action 可以直接在JSP页面中调用Action,可以直接把Action的处理结果包含在本页面

name和namespace确定要调用哪个action

executeResult指定是否把被调用的Action处理结果完全包含到页面中

include value属性用于包含指定的JSP页面

date 对日期进行格式化输出

name指定要格式化的日期对象

format指定格式化字符串

param 用于设置参数

删除

push 用于将某个值放入ValueStack的顶端

当我们的对象所在对象图“很深”时,可以将该对象“推入”ValueStack栈顶

UI标签

主题和模板

当我们使用标签时,它会自动生成两列布局,并且提供lable标签

——struts2为每个标签都提供了一个模板

所有的标签都有自己的模板,这一系列模板就称为主题

struts2一个提供了三个主题

simple:没有额外标签生成,只能生成原始的html元素,没有附加的标签(两列布局,lable)

xhtml:默认主题

1.两列布局

2.生成lable

3.输出错误提示

4.客户端验证

css_xhtml:在xhtml基础上增加了css样式

1.直接通过struts.ui.theme来设置默认的主题

2.为标签设置theme属性,子标签默认使用父标签的theme属性

3.通过page/request/session/application范围内的theme来设置主题



UI标签都可以指定cssClass、cssStyle来使用css样式

还可以指定大量的onXxxx属性,用于绑定javascript函数



表单标签:

checkbox 只生成一个复选框

head 引入一些辅助的CSS样式和JS脚本

file 生成一个文件域

form 表单,默认post提交

hidden 隐藏域

lable 文字

password 密码

reset 重置按钮

textarea 文本域(多行文本框)

textfield 文本框



select 下拉列表

radio 单选按钮

checkboxlist 一组复选框

optgroup 一组下拉列表选项



updownselect 加强版的select

optiontransferselect 两个updownselect的组合

doubleselect 两个列表框,有级联效果

combobox 生成一个文本框和列表框的组合

token 防刷新

默认情况下,如果没有进行防刷新的控制,

每次刷新都会添加一条完全相同的记录

1.在表单中添加一个标签

2.在action配置中增加一个token拦截器

它自己会检测用户是否刷新率页面

如果检测到用户刷新页面,系统返

回一个invalid.token的逻辑视图

3.需要为invalid.token的逻辑视图配置一个物理视图资源

文件上传

以前的文件上传

1.需要将form的enctype的值设置为multipart/form-data

2.需要启用一个上传文件的组件(smartupload,common-fileupload)

3.在session中通过文件上传组件的request对象来过去强求参数

获取上传的文件,得到文件后,以IO流的像是把文件写入到磁盘

Struts2上传更简单

A.每个文件上传域,需要在action中提供3个filed进行封装

1.与文件上传域的name同名的、类型为java.io.File的file

2.名为文件上传域的name+FileName、类型为String的file

3.名为文件上传域的name+ContentType、类型为String的file

B.使用IO流控制将文件写入到服务器的物理磁盘上



文件过滤

A.过滤上传文件的类型

B.过滤上传文件的大小

文件过滤方式有两种:

1.在action通过代码来实现

2.直接使用fileUpload拦截器进行过滤
献花(0)
+1
(本文系Iknown_Ilov...首藏)