1.struts.xml 中的action不是代表一个action类(控制器),而是代表一次访问,所以action的name属性和访问路径有关。配置文件中的package的namespace属性其实就是起到窄化请求的作用,将相同类型的请求,配置在一起,方便维护
2.访问路径理解:先找到namespace为XXX的package,再找到name为XXX的action,再找到该action对应的具体action类,再找到该类对应的具体的方,执行返回数据
即浏览器*问的地址为http://localhost:8080/项目名/package namespace/action Name.这个时候就已经能够调用action了。再根据action上配置的method,调用action的对应方法。package的name属性起到标识和继承的作用
3.struts 的action是多例的,这个spring的Controller是不同的
4.struts 获取值的方式:
1)属性驱动:需要在action中根据需要添加与页面对应的属性,并提供属性对应的set方法,(不必提供get方法),适用于属性比较少的
2)模型驱动,侵入式开发:Action类需要实现ModelDriven接口,重写getModel()方法,并且需要提供一个封装了页面数据(按需求封装即可)的模型对象(dto),在action中作为属性并创建对象,在getModel()方法中返回
3)域驱动:封装的页面数据对象作为action的属性(不用创建对象),并提供set/get方法。
这时页面的控件的name属性值要求为:
a.如果属性为对象,比如 private User user,那么页面name为user.name。
b.如果属性为list类型,比如 private List<User> users,那么页面name为user[0].name。user[0]表示list中的第一个User对象
c.如果 属性为map类型,比如private Map<String,USer> userMap,那么页面name为userMap['first'].name。userMap['first']表示map中key为fitst的value(这里是User)对象
经过测试:三种取值的方式可以混用。其中如果模型驱动有属性和属性驱动的属性相同,那么模型驱动中能够取到值,属性驱动取不到值为null。(域驱动不存在这个问题,因为页面的name值有特殊要求)
5.类型转换相关
1)struts2里面已经内置了一些转换器,负责完成String到基本类型的类型转换,比如:
基本数据类型的转换;本地格式的日期类型(yyyy-MM-dd)——> Date;把值是String[]类型的数据转换成用逗号隔开的字符串
2)如果struts2提供的转换器不满足需求,比如日期格式为dd-MM-yyyy那么转换就会出错,这个时候需求自定义转换器,并将自定义的转换器配置到框架使其起作用。如何自定义转换器参见链接:http://www.jb51.net/article/35465.htm。推荐使用继承StrutsTypeConverter的方式,因为双向转换分为俩个方法,不用自己判断更加清晰。
6.配置相关
1)虽然配置文件中有全局的配置,但是要起到全局的作用,依然是要通过package的继承达到效果的。如果不继承不会对该package起作用
2)这个配置 <exception-mapping result="error" exception="java.lang.NullPointerException"></exception-mapping>只适用于对action发送的指定异常跳转到对应页面。不支持配置的异常之外的异常,以及404异常。
3)只是用来继承的package可以省略namespace属性即默认为“”,就是说项目名 / 这里可以是任意内容 / action name,只要action name存在就能访问到,不存在当然报错
4)package的继承和java的基础很像即:通过使用extends,你可以指定本package继承另外一个package的所有的配置。当某个package继承了另外一个package的所有配置,那么你就无需对父package中已经声明过的配置定义做再次的定义。同时,如果重复定义父package中已声明过的配置定义,那么这些重复定义声明将覆盖父package中的相关定义。
5)default-action-ref配置和package的namespace有关,意思是访问该namespace下的action 的name不存在时,调用该配置配置中的action。可以通过在父包中添加该配置以及一个通用的action配置,为每个namespace提供跳转到404页面的功能(这些是要基于理解包继承的概念的前提下去理解的)
6)default-class-ref配置,是在有的action 只配置了name,和method的时候起作用,为这种配置的action配置上默认的对应的action类
7.struts 获取原生的servlet api(request,session,application)的方法
1)struts对底层servlet api做了包装,这点可以从数据类型看出来,比如struts的包装后的对象均是Map数据类型,而servlet原生的为HttpServletRequest,HttpSession,ServletContext
2)获取的方式为:
struts(包装 Map 类型) | servlet(原生) | |
request |
|
|
session | ac.getSession() | req.getSession() |
application | ac.getApplication | req.getServletContext() |
如上所示,获取的方式不止列出的方法
具体ActionContext和ServletActiveContext的区别参考链接:http://www.cnblogs.com/x_wukong/p/3887737.html