strust学习笔记全Word文档下载推荐.docx

上传人:b****5 文档编号:21305315 上传时间:2023-01-29 格式:DOCX 页数:9 大小:20.75KB
下载 相关 举报
strust学习笔记全Word文档下载推荐.docx_第1页
第1页 / 共9页
strust学习笔记全Word文档下载推荐.docx_第2页
第2页 / 共9页
strust学习笔记全Word文档下载推荐.docx_第3页
第3页 / 共9页
strust学习笔记全Word文档下载推荐.docx_第4页
第4页 / 共9页
strust学习笔记全Word文档下载推荐.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

strust学习笔记全Word文档下载推荐.docx

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

strust学习笔记全Word文档下载推荐.docx

(原来是用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这两个

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 企业管理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1