strutsAction.docx
《strutsAction.docx》由会员分享,可在线阅读,更多相关《strutsAction.docx(8页珍藏版)》请在冰点文库上搜索。
![strutsAction.docx](https://file1.bingdoc.com/fileroot1/2023-4/28/a486fb1f-b5cc-4e13-9483-a9ba52d9576b/a486fb1f-b5cc-4e13-9483-a9ba52d9576b1.gif)
strutsAction
关于Action的知识:
第一:
namespace:
Namespce决定了action的访问路径(即浏览器中输入的地址),默认为“”(空),可以接受所有的action
Namespace最好用模块命名比如这个pakage是对用户进行管理,那就命名为user即可
namespace也写成/user
Namespace写的话必须以/开头
Namespace不写时等价于namespace=“”,意味着不会定位到准确的action,范围太广
第二:
Pakage:
和java中的类似。
给action打包的,解决action重名的问题
第三:
result:
凡是result的name是success的都可以省略name不写
第四:
Action中class的配置:
(说明这个Action是一个classclass中写action时不要加入后缀.java)当访问这个Action的时候,他会找到其对应的class,找到之后就会执行里面的execute方法会根据他的返回值去找对应的jsp页面
具体视图的返回可以由用户自己定义的Action决定
具体的Action的实现可以是一个普通的java类,里面有publicStringexecute方法即可,或者实现Action接口,最常用的是从ActionSupport继承,这样可以使用struts封装好的方法。
第五:
Action的三种写法:
方法一:
写一个普通的java类。
里面写一个execute方法即可
方法二:
实现Action接口
方法三:
继承ActionSupport类(ActionSupport本身就实现了Action接口)(开发就只用这一种方法)
第六:
路径问题说明:
理解jsp中的basepath:
代表当前的项目路径
struts2中的路径问题是根据action的路径而不是jsp路径来确定,所以尽量不要使用相对路径。
虽然可以用redirect方式解决,但redirect方式并非必要。
解决办法非常简单,统一使用绝对路径。
(在jsp中用request.getContextRoot方式来拿到webapp的路径)
或者使用myeclipse经常用的,指定basePath
第七:
Action执行的时候并不一定要执行execute方法
可以在配置文件中配置Action的时候用method=来指定执行哪个方法。
也可以在url地址中动态指定(动态方法调用DMI)(推荐)
前者会产生太多的action,所以不推荐使用
第八(struts2中的两种访问方式):
1.action的method属性
2.动态调用DMI(就是在访问的时候声明比如调用user里面的add/user!
add)
Action默认是调用execute方法,但是可以通过method方法指定Action调用哪个方法
但是这个方法的形式要和execute一致返回值是String(不用此方法)
第九:
通配符(wildcart)(比DMI更简单)
使用通配符,将配置量降到最低
不过,一定要遵守"约定优于配置"的原则
第一种:
*和{1}搭配
Method里面的数字,是指调用的方法名字要和第几个*匹配
第二种:
注意这里访问时T要大写,要和TeacherAction保持一致才能匹配上
使用通配符的前提,Action和jsp的名字都要约定好
访问时按照约定访问即可
第十:
Action如何接收参数:
(3中接收参数的方式)
1.用action的属性接收参数(在action中定义属性,并添加get、set方法)
也就是在浏览器中传递的参数会和Action的成员变量一一对应会把参数传到成员变量中这样也不存在类型转换问题了
2.域模型(使用DomainModel接收参数):
(最常用)
域模型相当于实体类,就是把属性那部分抽象出来单独放在一个类中
调用对象时不需要new因为struts会帮你new
这样引用即可privateUseruser
Dto:
数据传输对象
当数据传过来和与模型不匹配时(比如注册时的密码确认功能)可以使用DTO接收参数,之后再把参数传给域模型
3.(不常用)使用ModelDriven接收参数(不要忘了使用泛型)
各种Action来充当MVC中的C
这种接收参数的方法必须要实现ModelDrive(xwork里面的)这个接口
并且必须要自己new对象struts不会帮你new对象了此时
Struts2重点吧实现放在了M层写Action
第一:
接收参数过程中有中文的解决方式:
在struts.xml中配置constant常量
I18n:
国际化但是只是这样也变不过来这在2.1.6版本中是个bug在2.1.7中才修正过来
但是可以在web.xml中配置一个过滤器,即可
最好:
要么用新版本的struts要么用spring的过滤器
在struts-core这个jar包下面的第一个包中的properties文件中可以查看struts的默认配置(default-properties)
第十:
简单的数据校验:
SimpleDataValiation
使用addFieldError方法和s:
fieldError标签简单处理数据校验,以及如何吧出错的信息在jsp页面中取出来(使用struts的标签库。
需要在jsp页面中指定)
Uri用于引入标签库prefix用于指定,前缀是什么
Struts2的展现标签用的不多没有可以选择的余地而且展现效果不好
栈:
就是一个容器特点:
后进先出
Struts会把Action的属性放到valuestack中取出其中的信息就用propertiy>标签
值栈(valuestack):
里面存的没一个东西都有一个name和value
但对于error来说使用Map存储还是一个name和一个value
但是map里面的value是个字符串类型的数组
Errors.name[0]
表示取到name的value的第一个值这就是OGNL表达式
一般一个用户登录之后,需要向session中写入信息以确认这个用户已经登录
第十二:
(struts中访问web元素)在struts2中访问sessionrequestapplication等(一般就访问这三个)内置对象。
取得Map类型的request,session,application,
真实类型的HttpServletRequest,HttpSession,ServletContext的引用:
第一种方式:
定义的三个变量都是Map类型
Context:
程序执行时周围的环境
注意:
在页面中访问的request和sessionapplication是一个httpRequest和httpSession和httpApplication
但是struts在处理的过程中会把Map的值复制到那三个对象中,所以在前台使用最原始的访问方式也能访问到
前台可以用标签的形式访问request等的值
方法二:
实现接口的方式(就用这种)
有两个设计思想:
DI(依赖注入)IoC(控制反转)
Request和application几乎不用
第十三:
在struts.xml中包含其他的xml文件
第十四:
默认Action的引用
需要在配置文件中加入
DefultAction可以随便设置如果访问的某个页面不存在就会跳转到这个默认页面
ImplementsRequestAwareSessionAware
注意:
第一:
从一个项目copy出另一个项目时,需要改一个地方,否则访问不到。
项目—右—properties—myeclpse—web--更该web—contextroot(改为新项目的名字)
第二:
更改jsp的默认编码:
window—preferences—搜jsp右侧换成
在一个普通的java类中只要有一个execute方法并且返回值是String的struts2就会把他当做一个Action,而struts1是离不开servlet环境的
第三:
struts2中每次访问都会创建一个对象,而struts1中Action只创建一个对象,每次访问都用同一个,所以这会出现线程同步的问题不安全。
而struts2永远不会出现线程同步的问题,因为每次访问Action都会new一个对象。
第四:
如果一个Action没有配置classstruts2默认执行自己的class既是ActionSupport(他用的框架是xwork)需要加入其源码才能看。
第五:
添加ActionSupport的源码:
右键—xwork.jar—properties—javasorceattachment添加指定路径