更新struuts2 的action后不能马上反应,要重启服务器才可以,加上
<constant name="struts.devMode" value="true"/>
开启开发模式即可随时更改action。
struts2核心的内容就是将请求与视图分开
namespace为空囊括了其他package处理不了的所有其他action
struts2 每次访问都会new一个新的action对象,不会像struts1一样一直都是同一个对象,会造成线程不同步
actionsupport已经封装好了一系列action方法,直接extends就可以了。记住这一个action编写方法就可以
动态方法调用(DMI),可以不再action配置中加上method,直接在地址路径里actionname后加!加方法名就可以直接调用对应action的对应方法。
也可以用通配符调用,在action的name中用*匹配所有,method用{1}匹配对应*,在result中用{1}或者{2}等匹配对应*。(约定优于配置必须提前约定好)
首先匹配最精确的,最接近的
action的三种实现方法,
action的三种接受参数的方法:
1.从action中定义好变量,写好getter和setter
传值的时候是调用的这个两个防范,getter和setter方法名必须跟传入的匹配,变量名可以不匹配,但是没啥意义。
2.使用预模型,将传入的参数封装到对象中,在类中写好setter和getter,在action中直接写好类的setter和getter就可以直接获取传入的参数。传入的参数与action中新建的类变量名意义,例如,action中新建private User user,传入了user.name和user.pass,就直接可以获取到这个类实例中的对应数据,类的初始化由struts搞定。
DTO
3.不常用。采用ModelDriver,交给模型处理。
其中有一个getModel方法,采用泛型,将数据传给mode,也就是2中的预模型。然后就可以采用set和get了。
(很明显的是MVC模式,struts2在control中比较核心)
struts中的constan的属性等等,去哪里查?
例如i18n等,devmode
在struts中的doc文件夹中查找。
接受参数中文处理:
有中文,就尽量不要用get。
将struts2.i18n.encoding默认值改为GBK应该就可以了
数据校验:
可以使用addFieldError方法和s:fieldError标签简单处理数据校验
actionError表示action出错的一些信息,fleldError表示一些属性出错的信息
addFieldError对同一个属性加多个错误,会在error中顺序产生对应的错误数组。
s:debug标签可以查看一些运行时候的信息等。
s:property 标签专门取value stack里面的属性
<s:property value="name">就是取到了名称为name的值
取得map类型的request,session,application
1.在构造方法或者execute中取值。
定义好
Map request;
Map session;
Map application;
request=(Map)ActionContext.getContext().get("request");
session=ActionContext.getContext().getSession());
application=ActionContext.getContext().getApplication();
1.在前台可以用request.getAttribute()访问到,说明struts2给map类型的这三个对象和真正的httprequest,httpsession,httpapplication建立了对应的关联。
2.也可以用#key类型访问,在s:bug中有说明
ActionContext的值可以在s:debug中的stack context中看到
访问web元素,request等等
第二种方式(最常用)
定义成Map<String ,object>泛型方式,就不会有警告了
实现了requestAware,SessionAware,applicationAware接口
要求提供setRequset(),setSession(),setApplication()方法。
实现了这三个接口,就可以接受原始的request,session,application放到对应的map类型中
这种设计思想成为
IOC(控制反转,inverse of control),控制权交给他人,他人来完成
也可以称为DI(依赖注入dependebcy injection):依赖别人注入的值
第三种
定义为HttpServletRequest,HttpServletSession,ServletContext类型
用servletActionContext.getrequest获取就行,session与application同样
第四种
定义为HttpServletRequest,HttpServletSession,ServletContext类型
实现ServletRequestAware接口,有一个setServletRequest()方法
传入HttpServletRequest request,this.request=request;this.session=request.getsession();
this.application=session.getServletContext();
srruts.xml可以用include标签包含其他的xml文件,可以用来分模块
可以再找不到action或者action错误的时候,设置default-action-ref设置默认的action。这样可以设置错误页面等等常用的提示页面
result类型(type):
1.dispatcher(默认)服务器跳转到结果页面,但是不能是action
服务器端跳转
2.redirect(跳转到视图)
客户端跳转,
3.chain(forward到一个action)
可以到同一个包或者其他包,
4.redirectAction 到另外一个action
5.freemarker
6.httpheader发一个http头信息
7.stream 下载
8.velocity 类似freemarker
9.xslt 修饰
10.plaintext 页面源码
11.tiles 分隔页面为几块
globalresults:
加入有许多action有共同结果,可以用global-result类型设置result结果集。
默认拦截器在struts—default.xml中已经默认配置了
动态结果集(专门在struts配置文件中的ognl表达式),在action中的${}这个方式读取value stack里面的内容,用来动态确定action中设定的result结果
带参数结果集,可以在result中加上?t=${}动态带上属性就可以
一次forward(服务器端的)共享一个值栈,不用传参数
客户端的话就需要传参数(redirect中)
action中定义对象接受属性,只有传入有值才会构造这个对象实例。
例如传入user.age=9,action中定义了user对象才会被action实例化(对象中必须有参数为空的构造方法才可以,要不然对象为null),
如果不传入user对应的值,则user为null,当然自己手动实例化也可以有值
总结:domain model可以传参,可以自己new,但是要保持空的构造方法