struts2(三)
2016-06-25 08:43
288 查看
1、在页面上可以写struts2的标签,但是浏览器是不识别struts2标签的
2、当在页面上写完struts2标签的时候,struts2内核会对标签进行翻译成html标签,在翻译的过程中会多增加很多内容
3、修改方案:
在服务器启动的时候,struts2内部会去org/apache/struts2下面加载一个properties文件:default.properties文件
一些参数的说明:
struts.i18n.encoding=UTF-8 默认的编码
struts.action.extension=action,, 默认的扩展名
struts.devMode = false 开发模式
默认值为false 改了配置文件以后必须重新启动
值为true 改了配置文件以后,struts2内部会自动检查,重新加载
struts.ui.theme=xhtml ui的主题
可以把xhtml的值改成
4、改变default.properties文件中的配置
在xml文件中,有一个元素为constant,为常量元素,该元素的作用就是为了改变default.properties文件中的值
开发模式
简单样式
5、两个比较重要的标签
s:select
value属性 指向集合的位置
listKey option中的value
listValue option标签的内容
headerKey 第一个option的value
headerValue 第一个option的内容
s:checkboxlist
属性同上
必须有name属性
6、ui标签的好处:
1、在页面上如果使用struts2的ui标签,不用再写过滤器进行编码的处理
2、使用struts2的ui标签对于数据的回显示很方便的
3、一般情况下,在页面上需要对数据进行回显,则数据放在对象栈中
ActionContext.getContext().getValueStack().push(person1);
4、页面上可以根据struts2标签中的name属性进行回显
5、如果把数据放入到了map栈中,则页面上必须根据value进行回显
6、在s:form标签的各种元素中:
s:textfield
s:textarea
s:password
….
如果要想用value属性进行回显,也就是说value属性内容要跟ognl表达式
value=”%{ognl表达式}”
拦截器
拦截器的目的:
如果在一个业务逻辑方法中设计到的逻辑相当复杂,可以把这些业务分离开:
例如:保存用户
1、启动日志
2、检查权限
3、文件的上传
4、保存用户
如果用传统的方法做,以上4点都在同一个方法中,这样耦合性很强
步骤:
1、准备页面:
在页面中准备一个文本框,该文本框在一个表单中
2、准备action
在action中有一个方法:saveUser
在action中准备一个属性,该属性是为了获取文本框的值
在saveUser中做如下的工作:
对该属性的值进行判断,如果值为”admin”,输出”save user”
如果值不为”admin”,输出”没有权限进行访问”
用拦截器实现的步骤:
1、准备页面
2、准备action
4、配置
属性驱动:
1、目的:在action中声明一些属性,这些属性能够获取到表单中的值
2、步骤:
1、在action中声明一些属性,属性的名称和页面上name属性的名称一致
2、这些属性在action中必须有setter和getter方法
3、原理:
在浏览器提交一个url请求时,先创建一个action,并且把action放入到对象栈中,这个时候
action的属性会出现在对象栈中,然后经过一个拦截器ParametersInterceptor拦截器
做的事情:
1、获取页面上表单中的name和value的值
2、把上述的name和value的值封装成一个map
3、根据valueStack.setValue(name,value);来把页面上的值设置到对象栈的name属性中
模型驱动:
模型驱动的原理:
表单验证
步骤:
1、写一个action,填充validate方法
2、当在页面上写完struts2标签的时候,struts2内核会对标签进行翻译成html标签,在翻译的过程中会多增加很多内容
<s:form action=""> <s:textfield name="username" value="111"></s:textfield> </s:form> 翻译成html: <table class="wwFormTable"> <tbody> <tr> <td class="tdLabel"></td> <td> <input id="_username" type="text" value="111" name="username"> </td> </tr> </tbody> </table>
3、修改方案:
在服务器启动的时候,struts2内部会去org/apache/struts2下面加载一个properties文件:default.properties文件
一些参数的说明:
struts.i18n.encoding=UTF-8 默认的编码
struts.action.extension=action,, 默认的扩展名
struts.devMode = false 开发模式
默认值为false 改了配置文件以后必须重新启动
值为true 改了配置文件以后,struts2内部会自动检查,重新加载
struts.ui.theme=xhtml ui的主题
可以把xhtml的值改成
4、改变default.properties文件中的配置
在xml文件中,有一个元素为constant,为常量元素,该元素的作用就是为了改变default.properties文件中的值
开发模式
简单样式
5、两个比较重要的标签
s:select
value属性 指向集合的位置
listKey option中的value
listValue option标签的内容
headerKey 第一个option的value
headerValue 第一个option的内容
s:checkboxlist
属性同上
必须有name属性
6、ui标签的好处:
1、在页面上如果使用struts2的ui标签,不用再写过滤器进行编码的处理
2、使用struts2的ui标签对于数据的回显示很方便的
3、一般情况下,在页面上需要对数据进行回显,则数据放在对象栈中
ActionContext.getContext().getValueStack().push(person1);
4、页面上可以根据struts2标签中的name属性进行回显
5、如果把数据放入到了map栈中,则页面上必须根据value进行回显
6、在s:form标签的各种元素中:
s:textfield
s:textarea
s:password
….
如果要想用value属性进行回显,也就是说value属性内容要跟ognl表达式
value=”%{ognl表达式}”
拦截器
拦截器的目的:
如果在一个业务逻辑方法中设计到的逻辑相当复杂,可以把这些业务分离开:
例如:保存用户
1、启动日志
2、检查权限
3、文件的上传
4、保存用户
如果用传统的方法做,以上4点都在同一个方法中,这样耦合性很强
目标: 把这四方面的内容分开,完全松耦合
步骤:
1、准备页面:
在页面中准备一个文本框,该文本框在一个表单中
2、准备action
在action中有一个方法:saveUser
在action中准备一个属性,该属性是为了获取文本框的值
在saveUser中做如下的工作:
对该属性的值进行判断,如果值为”admin”,输出”save user”
如果值不为”admin”,输出”没有权限进行访问”
用拦截器实现的步骤:
1、准备页面
2、准备action
public class InterceptorAction extends ActionSupport{ public String saveUser(){ ActionContext.getContext().put("message", "save user"); return "privilege"; } }
说明:该action的saveUser方法和权限没有任何联系
public class PrivilegeInterceptor implements Interceptor{ @Override public String intercept(ActionInvocation arg0) throws Exception { /** * 接受页面的参数进行判断 */ String username = ServletActionContext.getRequest().getParameter("username"); if("admin".equals(username)){ return arg0.invoke(); }else{ ActionContext.getContext().put("message", "权限不足,没有办法访问"); return "privilege"; } } }
4、配置
<interceptors> <!-- 声明一个拦截器 --> <interceptor name="privilege" class="cn.itcast.sh08.struts2.interceptor.PrivilegeInterceptor"></interceptor> <!-- 声明了一个拦截器栈 --> <interceptor-stack name="privilegeStack"> <!-- 引用默认的拦截器栈 --> <interceptor-ref name="defaultStack"></interceptor-ref> <!-- 引用自己创建的拦截器 --> <interceptor-ref name="privilege"></interceptor-ref> </interceptor-stack> </interceptors> <default-interceptor-ref name="privilegeStack"></default-interceptor-ref>
拦截器的意义在于:可以把一些和业务逻辑没有关系的代码放入到拦截器中,做到这些代码和业务逻辑的松耦合 概念: 1、拦截器:实质上是一个类,实现了Interceptor接口的一个类 2、拦截器栈:把很多个拦截器集中在一起就是拦截器栈 3、struts2有一个默认的拦截器栈,该栈在struts-default.xml文件中的struts-default包中 结构为: <package name="struts-default"> <interceptors> //声明一个拦截器 <interceptor name="exception" class="com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor"/> //声明一个拦截器栈 <interceptor-stack name="defaultStack"> //引用上面声明的拦截器 <interceptor-ref name="exception"/> <interceptor-ref name="alias"/> <interceptor-ref name="servletConfig"/> <interceptor-ref name="i18n"/> <interceptor-ref name="prepare"/> <interceptor-ref name="chain"/> <interceptor-ref name="debugging"/> <interceptor-ref name="scopedModelDriven"/> <interceptor-ref name="modelDriven"/> <interceptor-ref name="fileUpload"/> <interceptor-ref name="checkbox"/> <interceptor-ref name="multiselect"/> <interceptor-ref name="staticParams"/> <interceptor-ref name="actionMappingParams"/> <interceptor-ref name="params"> <param name="excludeParams">dojo\..*,^struts\..*</param> </interceptor-ref> <interceptor-ref name="conversionError"/> <interceptor-ref name="validation"> <param name="excludeMethods">input,back,cancel,browse</param> </interceptor-ref> <interceptor-ref name="workflow"> <param name="excludeMethods">input,back,cancel,browse</param> </interceptor-ref> </interceptor-stack> </interceptors> //让struts2内部执行默认的拦截器栈或者拦截器 <default-interceptor-ref name="defaultStack"/> </package> 4、拦截器的执行顺序: 按照拦截器栈从上到下执行,执行完拦截器以后,再执行action,例如: <interceptor-stack name="privilegeStack"> <interceptor-ref name="defaultStack"></interceptor-ref> <interceptor-ref name="privilege"></interceptor-ref> </interceptor-stack> 先执行默认的拦截器栈,后执行privilege <interceptor-stack name="privilegeStack"> <interceptor-ref name="privilege"></interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack> 先执行privilege,后执行默认的拦截器栈
属性驱动:
1、目的:在action中声明一些属性,这些属性能够获取到表单中的值
2、步骤:
1、在action中声明一些属性,属性的名称和页面上name属性的名称一致
2、这些属性在action中必须有setter和getter方法
3、原理:
在浏览器提交一个url请求时,先创建一个action,并且把action放入到对象栈中,这个时候
action的属性会出现在对象栈中,然后经过一个拦截器ParametersInterceptor拦截器
做的事情:
1、获取页面上表单中的name和value的值
2、把上述的name和value的值封装成一个map
3、根据valueStack.setValue(name,value);来把页面上的值设置到对象栈的name属性中
模型驱动:
1、创建一个javabean,javabean中的属性和页面中表单中的name属性的内容保持一致 2、在action里实现一个接口ModelDriven<Person> 3、在action中声明一个属性,并且创建该属性的对象 private Person modle = new Person(); 4、在action中有一个方法: @Override public Person getModel() { // TODO Auto-generated method stub return this.modle; } 该方法返回模型驱动对象
模型驱动的原理:
模型驱动经过两个拦截器: 1、ModelDrivenInterceptor 1、得到action 2、由action强制转化成ModelDriver 3、由ModelDriver.getModel()获取模型对象 4、把模型对象放入到栈顶 2、ParameterInterceptor 把form表单的数据封装到相应的对象栈中的属性中
表单验证
步骤:
1、写一个action,填充validate方法
@Override public void validate() { if("".equals(this.getUsername())||"".equals(this.getPassword())){ this.addActionError("用户名或者密码不能为空"); } }
2、在struts2的配置文件中:
<result name="input">validate.jsp</result>
如果验证不成功,则转向input指向的页面 3、页面上要有验证不成功的信息标签:
<s:actionerror/>
相关文章推荐
- 表格标签table深入了解
- WEB标准网页布局中尽量不要使用的HTML标签
- 如何使用jquery easyui创建标签组件
- web标准知识――用途相似的标签
- h1标签的使用技巧
- 探讨JavaScript标签位置的存放与功能有无关系
- HTML代码中标签的全部属性 中文注释说明
- 第九章之路径分页标签与徽章组件
- javascript实现label标签跳出循环操作
- Bootstrap每天必学之标签与徽章
- jQuery EasyUI 布局之动态添加tabs标签页
- jQuery+CSS实现滑动的标签分栏切换效果
- jquery 实现两Select 标签项互调示例代码
- 详解jQuery Mobile自定义标签
- jQuery获取标签文本内容和html内容的方法
- JavaScript获取并更改input标签name属性的方法
- css样式标签和js语法属性区别
- JSP自定义标签入门学习
- JSP中param标签用法实例分析
- jsp之c标签用法实例分析