您的位置:首页 > 编程语言 > Java开发

struts2(三)

2016-06-25 08:43 288 查看
1、在页面上可以写struts2的标签,但是浏览器是不识别struts2标签的

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/>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  struts2.0 标签