strust学习笔记全.docx
- 文档编号:8169038
- 上传时间:2023-01-29
- 格式:DOCX
- 页数:9
- 大小:20.75KB
strust学习笔记全.docx
《strust学习笔记全.docx》由会员分享,可在线阅读,更多相关《strust学习笔记全.docx(9页珍藏版)》请在冰豆网上搜索。
strust学习笔记全
struts2
1.struts简介:
先导入struts-blank.war到eclipse中,这是一个空的工程,把它作为模板进行开发
是不是用了struts就可以抛弃servlet?
struts底层仍然是servlet,其实是用了一个Filter来进行分发(在web.xml中配置)。
2.strusts配置文件
到底哪个请求分给给哪个类来处理,这个在struts.xml文件中进行配置
3.处理类Action类的写法
一、定义一个普通类,在其中定义一个publicStringexecute()方法,在其中写上处理逻辑,这个方法会在对应的请求过来时自动回调。
二、除此之外还可以实现接口Action,但现在暂时没有必要
三、继承ActionSupport,但现在暂时没有必要
4.MVC的简介
struts2中,XXXAction代表了C控制逻辑,xxx.jsp代表了V视图,另外还有模型M
strut2完全可以不去理会HttpServletRequest和HttpServletResponse,让我们从这些繁杂的Servlet的api中解放出来。
如何取出请求中的参数呢?
(原来是用req.getParameter("xxxx"))
Struts中只需要将Action类的属性定义为和请求参数同名即可(框架会自动读取请求参数,并自动注入到同名的属性中去),我们只需要在execute方法中将属性的值(也就是参数的值)取出来用就可以了。
如何在Action中往后面的jsp传值呢?
(原来是用req.setAttribute("xxx","xxxx"))
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。
比如:
DMIdynamicmethodinvocation动态方法调用
一个Action中定义多个方法,在配置文件中却只注册这个Action本身
在前端,使用url:
xxx!
方法名来调用对应的方法来处理请求
注意:
这种方式比较危险,默认关闭,需要设置一个Constant去开启
开启完就能使用动态方法调用了,比如,CalAction中有一个add方法和minus方法
cal!
add调用add方法
cal!
minus调用minus方法
8.一个
例如:
注意:
result的name可以是任意字符串,只要和return的返回值一致即可。
一般来说,有几种常用的值
success代表成功
error代表错误
input代表回到之前的页面
login代表回到登录页面
乱码:
在server.xml中找到
再重启Tomcat
在struts.xml中定义常量
包的命名空间:
要把struts.xml拆分成不同的模块,
1.ActionContect使用它可以获取session,可以调用其静态方法getContext获取一个上下文对象
type的值有:
dispatcher相当于forward,转发,在服务端内容进行
redirect重定向,响应回客户端,由客户端再次发起请求
chain一个Action转发到另一个Action,可以多次这样转发,就像一根链条上有很多个Action,只需要在
redirectAction重定向到另一个action,只要把另一个action的名字写在result标签中即可
--这里我们要重定向到red.jsp,要把这个结果result的类型改为redirect-->
2.全局result
可以在
比如:
在这个
这样的话,就可以减少大量的重复的
全局异常映射
当Action中出现了异常,可以让其统一处理,比如跳转到一个友好的错误提示页面
异常标签表示一旦出现exception属性中的异常,就自动跳转到result属性中的结果,这样即使在开发中疏忽或者外界环境因素导致了一些异常产生,也不会让用户在页面上看到非常不友好的提示信息,而是看到我们自定义的错误页面。
3.动态结果
在
这个变量到底是什么?
在编译时不确定,在运行时由之前的Action的属性page来决定
4.包的命名空间
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
这个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以后,我们可以用 fielderror>显示出之前的信息 fielderrorfieldName="name"> fielderror> --name输入框的错误--> 如果一个Action类中有很多方法来处理请求,如何针对不同的方法使用不同的验证逻辑呢? 可以使用validateXXX()方法,比如,业务逻辑方法名为add(),那么就用validateAdd(). 另外也可以用纯xml来进行验证。 只要把验证的xml文件放在类的同一个包下,就可以自动验证,不需要写java代码。 2.拦截器 在Action之前、之后进行拦截操作的实例,可以层层嵌套,灵活组合,统一实现类似的功能。 Struts中默认就有很多拦截器,比如参数注入拦截器、类型转换拦截器等,我们通过在 没有默认的那些拦截器,大部分功能无法正确实现。 自定义拦截器 1、定义一个类继承AbstractInterceptor 2、实现其抽象方法,并在其中写上拦截的逻辑 3、在调用其invocation.invoke()之前和之后就是切面编程 4、可以将invoke的返回值再return给外层拦截器继续处理 拦截器类定义完后,还要在struts.xml中声明,用: 还要在需要拦截的Action中引用之前定义和声明的拦截器 也可以在一个包中,用 拦截器栈的声明,里面可以声明很多个拦截器,整个拦截器栈可以当作一个拦截器来使用 我们默认就在使用struts为我们预先定义好了的一个拦截器栈defaultStack,里面有很多的拦截器,如: 参数拦截器、日志拦截器、转型拦截器、上传拦截器、验证拦截器.....,只需要让包继承struts-default就能使用。 但是要注意,如果使用了自定义的拦截器后,默认的拦截器会失效,需要手动引用默认拦截器,比如: 3.struts文件上传: 客户端: 服务端: 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、在配置文件中定义 如果不想让所有属性都进入json字符串,可以用includeProperties name,age 比如这样就只会在json字符串中包含name和age了 name,hobbies.* 比如这样就只会包含name和hobbies这两个
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- strust 学习 笔记