strust学习笔记全Word文档下载推荐.docx
《strust学习笔记全Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《strust学习笔记全Word文档下载推荐.docx(9页珍藏版)》请在冰豆网上搜索。

(原来是用req.setAttribute("
xxx"
"
struts只需要把要传给后面的值,放在Action类的属性中,需要定义getter方法;
然后在后面的jsp中用el表达式就可以取出来了
Action是MVC中的C,控制;
Action中的那些接收参数的属性属于M,模型。
5.参数传递的方式:
一、把要接受的参数属性直接写在Action中
方便,但是将C和M耦合起来了
二、专门定义一个模型类,把参数属性都定义在模型类中,然后在Action中定义一个这种模型类的属性。
这样也能进行参数获取,但在前段参数名要写为模型属性.属性名
比如:
我们可以将name和age封装到一个User类中,在Action定义一个User属性user
在前端,我们就要这么写参数,user.name=tom&
user.age=20
这第二种方式将M、V、C彻底分离,在需求变更的情况下往往只要对一个模块进行修改,避免污染原先正确的代码。
三、ModelDriven方式,需要让Action类实现ModelDriven接口,并实现getModel()方法;
在前端就不需要加模型名字,仍然用name=xxx&
age=xxx这种方式。
这种方式不常用。
6.Action既能处理get方式的请求,也能处理post方式的。
后缀过滤,在web.xml中的filter的url-pattern中配置要用struts2处理的路径,可以用
*.action表示所有后缀为.action的请求都用struts2来处理
*.do表示所有后缀为.do的请求用struts2来处理
7.之前一个Action只能处理一个url的请求,但其实可以一个Action处理多个url请求。
方式就是在Action中定义多个方法,方法名随意,需要在struts.xml中定义哪个方法对应哪个url。
<
test"
...TestAction"
method="
test1"
这样写就表示路径为test的url的请求会由TestAction的test1方法来处理
abc"
test2"
这样表示路径为abc的url的请求会由TestAction的test2方法来处理
DMIdynamicmethodinvocation动态方法调用
一个Action中定义多个方法,在配置文件中却只注册这个Action本身
....XXXAction"
在前端,使用url:
xxx!
方法名来调用对应的方法来处理请求
注意:
这种方式比较危险,默认关闭,需要设置一个Constant去开启
constantname="
struts.enable.DynamicMethodInvocation"
value="
true"
/constant>
开启完就能使用动态方法调用了,比如,CalAction中有一个add方法和minus方法
cal!
add调用add方法
minus调用minus方法
8.一个<
action>
中可以定义多个<
result>
例如:
login"
....LoginAction"
resultname="
success"
/main.jsp<
/result>
input"
/login.jsp<
/action>
result的name可以是任意字符串,只要和return的返回值一致即可。
一般来说,有几种常用的值
success代表成功
error代表错误
input代表回到之前的页面
login代表回到登录页面
乱码:
在server.xml中找到<
Connector>
在里面定义URIEncoding="
UTF-8"
ConnectorURIEncoding="
........>
再重启Tomcat
在struts.xml中定义常量
struts>
Constantname="
struts.i18n.encoding"
/Constant>
package....>
<
action...>
....
/package>
/struts>
包的命名空间:
要把struts.xml拆分成不同的模块,
1.ActionContect使用它可以获取session,可以调用其静态方法getContext获取一个上下文对象
的<
可以有type属性,不写的话默认dispatcher。
type的值有:
dispatcher相当于forward,转发,在服务端内容进行
redirect重定向,响应回客户端,由客户端再次发起请求
chain一个Action转发到另一个Action,可以多次这样转发,就像一根链条上有很多个Action,只需要在<
中写上action的name即可
redirectAction重定向到另一个action,只要把另一个action的名字写在result标签中即可
red"
com.oracleoaec.action.RedirectAction"
!
--这里我们要重定向到red.jsp,要把这个结果result的类型改为redirect-->
type="
redirect"
/red.jsp<
2.全局result
可以在<
package>
中声明一个<
global-results>
/global-results>
在其内部定义全部的结果
error"
/error.jsp<
在这个<
中的任何一个<
对应的Action类中,都可以return到这个全局的结果
这样的话,就可以减少大量的重复的<
的定义
全局异常映射
当Action中出现了异常,可以让其统一处理,比如跳转到一个友好的错误提示页面
global-exception-mappings>
exception-mappingexception="
异常全名"
result="
全局结果名"
/exception-mapping>
/global-exception-mappings>
异常标签表示一旦出现exception属性中的异常,就自动跳转到result属性中的结果,这样即使在开发中疏忽或者外界环境因素导致了一些异常产生,也不会让用户在页面上看到非常不友好的提示信息,而是看到我们自定义的错误页面。
3.动态结果
在<
标签中不把jsp写死,而是用${}表达式写一个变量进去
/${page}.jsp<
这个变量到底是什么?
在编译时不确定,在运行时由之前的Action的属性page来决定
4.包的命名空间
packagenamespace="
/xx/aa/bb"
name="
..."
extends="
...."
...
1、可以用来划分不同的包(name不同且namespace也不同)
2、在访问时需要在上下文和action路径之间加上命名空间
比如像上面的package中有一个action名为login:
localhost:
8080/上下文工程名/xx/aa/bb/login.action
如果不写namespace相当于namespace="
"
只要url中最后的路径xx.action匹配就能定位到
要把struts.xml拆分为多个文件可以使用include
5.ActionContext使用它可以获取session
可以先调用其静态方法getContext获取一个上下文实例,再调用这个实例的getSession()获取一个代表Session的对象
Map<
String,Object>
session=ActionContext.getContext().getSession();
这个Session其实是一个Map,可以像操作HttpSession一样往里put,从里面get,或者remove。
(之所以设计成这样,返回一个Map,是为了降低耦合读,和Servlet毫无耦合)
6.要再页面显示action传来的list数据?
1、在Action类的属性中声明一个list
2、在执行方法中往这个list中填充内容
3、在jsp页面中使用jstl+el表达式,就可以取出list中的所有内容了
小知识点:
struts中的Action不是单例的,而是一个请求一个实例
这和Servlet的特性完全不同,Servlet是单例的
千万不要认为Action中的属性会保留到下一次请求,这些属性随着Action的执行完毕和销毁也会一起消失。
1.验证:
1、让你的Action继承ActionSupport
2、重写validate()方法
3、在这个方法里进行对参数属性进行判断,如果判断下来不符合要求,就是验证不通过,可以调用addFieldError(StringfieldName,Stringmessage),第一个fieldName表示哪个参数填错了,第二个message表示具体错在哪的详细信息。
一旦这个方法调用,Action就会自动跳回input,并会自动传递上面的错误信息
如果没有出错,那么就回会再去执行execute中的核心逻辑
4、跳回input的jsp以后,我们可以用<
s:
fielderror>
显示出之前的信息
fielderrorfieldName="
name"
/s:
fielderror>
--name输入框的错误-->
inputname="
br/>
如果一个Action类中有很多方法来处理请求,如何针对不同的方法使用不同的验证逻辑呢?
可以使用validateXXX()方法,比如,业务逻辑方法名为add(),那么就用validateAdd().
另外也可以用纯xml来进行验证。
只要把验证的xml文件放在类的同一个包下,就可以自动验证,不需要写java代码。
2.拦截器
在Action之前、之后进行拦截操作的实例,可以层层嵌套,灵活组合,统一实现类似的功能。
Struts中默认就有很多拦截器,比如参数注入拦截器、类型转换拦截器等,我们通过在<
中声明extends="
struts-default"
来使用这个默认包下的拦截器栈。
没有默认的那些拦截器,大部分功能无法正确实现。
自定义拦截器
1、定义一个类继承AbstractInterceptor
2、实现其抽象方法,并在其中写上拦截的逻辑
3、在调用其invocation.invoke()之前和之后就是切面编程
4、可以将invoke的返回值再return给外层拦截器继续处理
拦截器类定义完后,还要在struts.xml中声明,用:
interceptors>
interceptorname="
拦截器代号"
拦截器类全名"
/interceptor>
/interceptors>
还要在需要拦截的Action中引用之前定义和声明的拦截器
action....>
interceptor-refname="
也可以在一个包中,用<
default-interceptor-refname="
,让一个包中所有的Action都使用这个拦截器。
拦截器栈的声明,里面可以声明很多个拦截器,整个拦截器栈可以当作一个拦截器来使用
interceptor-stack>
interceptor....>
/interceptor-statck>
我们默认就在使用struts为我们预先定义好了的一个拦截器栈defaultStack,里面有很多的拦截器,如:
参数拦截器、日志拦截器、转型拦截器、上传拦截器、验证拦截器.....,只需要让包继承struts-default就能使用。
但是要注意,如果使用了自定义的拦截器后,默认的拦截器会失效,需要手动引用默认拦截器,比如:
action.....>
a"
/interceptor-ref>
defaultStack"
result......
3.struts文件上传:
客户端:
formaction="
....."
post"
enctype="
multipart/form-data"
file"
inputtype="
submit"
/form>
服务端:
1、定义一个类,继承ActionSupport
2、定义三个属性文件对象、文件名、文件类型,名字必须要遵循规范:
a、privateFileabc这个表示文件本身,文件内容,类型File,名字和inputname一致
b、privateStringabcFileName表示文件名,后面的固定为FileName,前面的和inputname一致
c、privateStringabcContentType表示文件类型,后面固定为ContentType,前面的和input的name一致
属性定义完一定要写上getter和setter方法
接下来就可以在execute方法中通过abcFileName自动获取到上传文件的名字,也可以通过Fileabc自动获取到对应那个上传文件的对象,可以进行拷贝,拷贝到本地某个文件中,就完成了上传
4.struts对json的支持
1、导入struts-json-plugin.jar的包到工程中
2、将struts-default改为json-default,这样就自动使用json相关的拦截器,当然也可以专门建一个包,extends="
json-default"
,里面全部都放ajax专用的Action
3、定义Action类,写法和之前一样,但是框架会默认把所有的属性封装成一个json对象、json字符串返回给客户端
4、在配置文件中定义
.."
resulttype="
json"
如果不想让所有属性都进入json字符串,可以用includeProperties
paramname="
includeProperties"
name,age
/param>
比如这样就只会在json字符串中包含name和age了
name,hobbies.*
比如这样就只会包含name和hobbies这两个