struts2学习

来源:互联网 发布:mac终端怎么使用 编辑:程序博客网 时间:2024/06/06 23:55
struts2获取请求参数:
在Struts中,因为struts2为一个MVC框架,那么对应的关系为:
V:jsp页面
M:action
C:action StrutsPrepareAndExecuteFilter
在Struts2中,获取请求参数:
1.属性驱动
   1.直接将action作为一个model,就可以得带请求参数(这种方式 ,底层是通过反射来实现的。)
问题1:action封装请求参数,会不会存在线程安全问题?
不会,因为每次请求都是一个新的action。
缺点:需要单独定义javaBean,将action中属性copy到javaBean中。
优点:简单。
2.在action中声明一个model(这种方式数据是通过struts2中的interceptor进行封装的<interceptor name="params"
class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>)。
private User user;提供get/set方法
在页面上使用ognl来描述。
优点:简单,解决了第一种封装的问题;
缺点:在页面上使用了ognl表达式,页面不通用了。

2.模型驱动(在开发中应用比较多)
步骤:1.让action类实现ModelDriven接口;
 2.重写getModel方法;
 3.在action中是实例化一个model对象,让getModel方法返回这个对象。
优点:解决了属性驱动存在的问题。
缺点:一次只能封装一个model对象。
1.将数据封装到List集合:
页面:username1:<input type="text" name="users[0].username"><br>
 password1:<input type="password" name="users[0].password"><br>
 
 username2:<input type="text" name="users[1].username"><br>
 password2:<input type="password" name="users[1].password"><br>
action类:private List<User> users;
get/set方法
2.将数据封装到Map集合
页面:username1:<input type="text" name="map['aaa'].username"><br>
 password1:<input type="password" name="map['aaa'].password"><br>

 username2:<input type="text" name="map['bbb'].username"><br>
 password2:<input type="password" name="map['bbb'].password"><br>
action类:
 private Map<String, User> map;
 提供get/set
 
struts2中提供的类型转换
在web中我们使用beanutils直接将表单数据封装到javaBean中。
struts2中action得到请求参数,也可以直接封装到javaBean.struts2 内部提供大量类型转换器,用来完成数据类型转换问题
boolean 和 Boolean
char和 Character
int 和 Integer
long 和 Long
float 和 Float
double 和 Double
Date 可以接收 yyyy-MM-dd格式字符串(例如:日期类型,我们传递  yyyy-MM-dd  yyyy年MM月dd日格式都可以,但是如果
是yyyy/MM/dd就会出现问题.)
关于struts2中的类型转换器根接口是:com.opensymphony.xwork2.conversion.TypeConverter。


自定义类型转换器:
步骤:
1.创建一个类实现TypeConverter接口.
2.重写接口中方法,实现类型转换操作.
3.注册类型转换器.
详解说明:
1.创建一个自定义类型转换器
1.实现TypeConverter需要重写public Object convertValue(Map<String, Object> context, Object target, Member member,
String propertyName, Object value, Class toType);如果实现接口,这个方法参数太多(6个)
2.不推荐实现接口,可以继承 DefaultTypeConverter类,优点:重写的方法参数没有那么多。
public Object convertValue(Map<String, Object> context, Object value, Class toType) {
return convertValue(value, toType);
}
3.个人推荐使用 继承DefaultTypeConverter类的一个子类StrutsTypeConverter.
原因:在这个类中将从页面传递的数据怎样封装,以及action中的数据怎样在页面上显示做了分离.
public abstract Object convertFromString(Map context, String[] values, Class toClass);
public abstract String convertToString(Map context, Object o);
2.怎样注册一个自定义类型转换器.
1.局部--针对于action
配置文件所在位置以及名称:  在Action类所在包 创建 Action类名-conversion.properties , 
配置文件书写:    格式 : 属性名称=类型转换器的全类名 
2.局部--针对于model
配置文件所在位置以及名称:  在model类所在包 创建 model类名-conversion.properties , 
配置文件书写:    格式 : 属性名称=类型转换器的全类名 
3.全局
配置文件所在位置以及名称:在src下创建一个xwork-conversion.properties
配置文件书写:  格式:  要转换的类型全名=类型转换器的全类名 
注意:
对于struts2中类型转换器,如果表单数据提交时,将数据向model封装,出现了问题,会报错:
No result defined for action cn.itcast.action.RegistAction and result input
上面的意思是说,在RegistAction的配置中没有配置input结果视图.
<action name="regist" class="cn.itcast.action.RegistAction">
<result name="input">/success.jsp</result>
</action>
如果配置了,出现类型转换问题,就会跳转到input指定的视图。为什么会向input视图跳转?
   是因为struts2中的拦截器(interceptor),在struts2中的
<interceptor name="conversionError" class="org.apache.struts2.interceptor.StrutsConversionErrorInterceptor"/>用于记录类型转换问题。
   在struts2中<interceptor name="workflow" class="com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor"/>
用于得到问题,向input视图跳转。
关于错误信息展示:通过分析拦截器作用,得知当类型转换出错时,自动跳转input视图 ,在input视图页面中 <s:fieldError/> 显示错误信息。
在Action所在包中,创建 ActionName.properties,在局部资源文件中配置提示信息 : invalid.fieldvalue.属性名= 错误信息
如果是自定义类型转换器,出现类型转换问题,要跳转到input视图,在类型转换器中,必须抛出异常才可以。
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 生完孩子没奶水怎么办 梦见让狐狸咬了怎么办 1岁宝宝不吃辅食怎么办 母乳不够宝宝不吃奶粉怎么办 吃母乳的宝宝不吃奶粉怎么办 宝宝吃母乳不吃奶粉怎么办 1岁婴儿不吃辅食怎么办 不喝奶瓶的宝宝怎么办 母乳不足宝宝不吃奶粉怎么办 4岁宝宝注意力不集中怎么办 孩子上课不专心听讲怎么办 小孩上课不认真听讲怎么办 一年级孩子上课不认真听讲怎么办 打了孩子很自责怎么办 4岁宝宝讲话结巴怎么办 网销客户不说话怎么办 两岁宝宝不说话怎么办? 4岁儿童说话结巴怎么办 3岁宝宝说话结巴怎么办 6岁儿童舌头短怎么办 5岁宝宝说话结巴怎么办 两岁宝宝说话晚怎么办 6岁儿童说话结巴怎么办 2岁宝宝呕吐拉稀怎么办 2岁宝宝突然呕吐怎么办 2岁宝宝呕吐发烧怎么办 2岁宝宝呕吐厉害怎么办 1岁宝宝半夜呕吐怎么办 2岁半宝宝呕吐怎么办 2岁宝宝半夜呕吐怎么办 两岁宝宝一直吐怎么办 原画师老了以后怎么办 孩子不想上学怎么办怎么去说服 嫉妒别人比我好怎么办 三岁宝宝爱打人怎么办 1岁宝宝喜欢打人怎么办 ps图层解锁不了怎么办 沈腾结婚马丽怎么办 延长甲没有纸托怎么办 高考第一志愿没录取怎么办 电子画颜料干了怎么办