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

struts2基础知识

2015-08-26 04:48 573 查看
Struts2

1 struts2的开发步骤

1.1下载jar包,放在WEB-INF的lib下

1.2编辑web.xml,添加struts的核心Filter

<filter>

<filter-name>struts2</filter-name>

<filter-class></filter-class>

</filter>

<filter-mapping>

<filter-name></filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

1.3创建struts.xml文件

1.4,编写Action类,继承ActionSupport

public LoginAction extends ActionSupport{

private String username;

getUsername(){}

setUsername(){}

public String excute(){

ActionContext.getContext.getSession().put(“user”,getUsername());

return succuss;}

}

1.5在struts.xml配置Action

<package>

<action name= “login” class=” loginAction”>

<result name=”success”> /login.jsp</result>

</action>

</package>

2常量配置

加载顺序自上往下,下面的会覆盖上面的

struts-default.xml

struts-plugin.xml

struts.xml

struts.properties

web.xml

为了防止struts,xml过于臃肿,可以使用包含include

<struts>

<include file = “ struts-part1.xml”>

</struts>

3.action访问Servlet API

1)

HttpServletRequest HttpSession ServletContext 分别对应jsp内置对象的request session application

通过ActionContext类

static ActionContext getContext() 返回ActionContext实例

Map getApplication() 返回ServletContext实例

Map getSession() 返回HttpSession实例

Object get (Object key) 相当于HttpServletRequest的getAttribute( String name)方法

Map getParameters() 相当于HttepServletRequest的getParameterMap()方法

2)

也可以直接访问Servlet API 通过实现接口 ServletRequestAware ServletContextAware ServletResponseAware

需要重写里面的一个方法例如 setServletResponse(...)方法

3)

通过ServletActionContext工具类的静态方法

ServletActionContext.getResponse()

getRequest()

getServletContext()

getServletPageContext()

4.result支持的类型

dispatcher 指向jsp 是默认的类型

redirect 重定向 url

redirectAction 重定向 另一个Action

stream 返回一个inputstream 一般用于下载

velocity 返回使用velocity作为模版的视图

4,动态结果

<action name=”crud_*” class=”” method={1}>

<result>/{1}.jsp</result>

</action>

如果是一个curd_create请求 就会调用 create方法 跳转到create.jsp页面

5.配置struts2的异常处理

在strut.xml中配置异常

全局的异常 <global-exception-mappings>

<exception-mapping exception=”java.Sql.SQLException” result=” sql” />

</global-exception-mappings>

在视图页面显示异常 <s:property value=”exception.message”/>

<s:property value=” exceptionStack”/>

6.struts2的标签

用户界面标签: 表单标签 . 非表单标签

非用户界面标签: 控制访问标签 和数据访问标签

ajax标签

导入struts标签库

<%@ taglib prefix=”s” uri =” /struts-tags”%>

6.1ONGL表达式

通过ognl可以获取stack context里面的值 包括valuestack map

${}

此外ognl可以创建list集合和map集合

list:{e1,e2,e3,...}

map:#{key1:value1, key2:value2,... }

6.2控制标签(9个)

1, 分支选择

<s:if test=””>

标签体

</s:if>

<s:else if test=””>

标签体

</s:else if>

<s:else >

</s:else>

例如:<s:if test=”#age>60”>

老年人

</s:if>

2.iterator标签

可以对list set map 数组 迭代

<s:iterator >有三个属性,\

value :可选属性,指定被迭代的集合,如果没有指定 ,则默认栈顶集合

id:可选属性,指定集合中元素的id

status:可选属性,指定迭代时的IteratorStatus实例,可以判断元素是否是最后一个,及元素的索引

<s:iterator value={} id=”name”>

<s:property value=”name”>

</s:iterator>

iteratorStatus实例的方法有;

int getCount()返回当前迭代了几个元素

int getIndex() 返回迭代元素的索引

boolean isEven()返回当前迭代元素的索引是否是偶数

boolean isOdd() .....是否是奇数

boolean isFirst()返回当前迭代的元素是否是第一个元素

boolean isLast() 返回当前迭代的元素是否是最后一个元素

<s:iterator value= id= status=”st”>

<s:if test=”#st.odd”>

3.append标签

用来拼接两个集合

新拼接成的集合叫newList,拼接后放在Stack context中

<s:append var=”newList”>

<s:param value =”#list1” />

<s:param value=”#list2” />

</s:append>

4.generator标签

类似于Spring.split()方法,但功能更加强大

val属性指定被解析的字符串

separator指定分隔符

<s:generator val=”你好,北京,天安门” separator=”,”>

<s:iterator >

<tr>

<td><s:property/></td>

</s:iterator>

</tr>

</s:generator>

输出结果为:

你好

北京

天安门

5.merge标签

也是用来拼接集合,但是拼接顺序和append不一样,用法和append类似

6.subset用来取得集合的子集

7.sort标签

对集合元素进行排序,

<s:sort source=”#list” comparator=”#myComparator” var=”sortedList”>

comparator比较器要自己定义,且放入容器中

6.3数据访问标签

action使用action标签用来在jsp页面直接调用action,

bean创建bean实例

date格式化日期 <s:date name=”#now” format=”dd/MM/yy” nice=”true”/>

i18n

include <s:include value=”hello.jsp” />

param

url 用来生成一个URL地址

<s;url action=”login”>

<s:param name=”author” value=”tom”>

</s:url>

text 输出国际化消息

property 输出指定值

6.4表单标签

<s:textfield name=””> 文本框

checkboxlist标签一次可以创建多个复选框

<s:checkboxlist name=”a” label =”请选择职业” labposition=”top” list={‘教师’,’医生’,’程序员’} />

<s:checkboxlist name= “a” label=”” list={#bs.books} listKey=”author” listVaule=”name”/>

<s: doubleselect >两个级联下拉表框 ,第一个变化,第二个也随着变化

select标签用来生成一个下拉列表框

multiple设置该列表框是否允许多选

用法类似于checkboxlist

radio标签生成多个单选按钮 ,用法和checkboxlist类似

<s:token />防止表单重复提交 无需制定参数

6.4非表单标签

<s:actionerror /> <s:actionmessage />

后台action类中 addActionError(“ 出错了”);

addActionmessage(“”)

<s:fielderror />用来输出表单校验错误,类型转换错误等

7.struts的类型转换

浏览器向web应用发送参数,要进行类型转换,参数都是字符串类型,而java是强类型语言

struts提供了强大的类型转换机制

类型转换可以基于ongl表达式,由于提供了转换器,大部分时候,不需要开发者手动转换.

7.1基于ongl的类型转换

例如:

<s:textfield name=”user.name”>

public class LoginAction impliments Action

{

private User user;

setUser()

getUser()

public string excute()

{

if(getUser().getName().equals(“tom”))

{

return success:

}

}

}

该例子通过ognl表达式将name封装到了user对象中

7.2指定集合元素的类型

例如: private List users;

由于没有指定泛型,所以要想知道集合元素的类型,我们可以通过配置文件

局部类型转换的文件名称为ActionName-conversion.properties,并和Action类文件在同一个路径下

内容是:Element_users=cn.myclass.User

对应map类型的 private Map map;需要指定key和value

Key_map=java.lang.String

Element_map=cn.myclass.User

7.3自定义类型转换器

1.编写一个类继承DefaultTypeConverter类,重写convertValue()方法

2.注册类型转换器

局部类型转换器

在ActionName-conversion.properties中

user=cn.myclass.UserConverter

全局类型转换器

Xwork-conversion.properties

cn.myclass.User=cn.myclass.UserConverter

通过注释来注册类型转换器

7.4类型转换错误的处理

conversionError拦截器会在类型转换错误是跳转到input视图

通过<s:fielderror>获取错误

8.struts2的输入校验

1.编写校验规则文件

ActionName-validation.xml

<validators>

<field name= “pass”>

<field-validator type=”regex”>

<param name=”expression”><![CDATA(\w{4,25})]]</param>

<message>您输入的密码只能是字母和数字,且在4~25之间</message>

</field-validator>

field name= “pass”>

<field-validator type=”requiredstring”>

<param name=”trim”>true</param>

<message> 必须输入密码</message>

</field-validator>

<./field>

</validators>

校验失败会跳到input视图 <s:fielderror>

2.可以对提示信息进行国际化

<message key=”pass.regex” />

然后在国际化文件中 mess.properties中添加

paas.regex=您输入的密码只能是字母和数字,且在4~25之间

3.struts的客户端校验

为<s:form >标签添加validate=true



<s:fielderror>

<s:form action=”” validate=”true”>

4.如果需要手动完成校验,那么可以在Action类中重写validate()方法

pubic class LoginAction extends ActionSupport

{

public void validate()

{

if(!name.contains(“tom”))

{

addFieldError(“user”,”您的用户名必须包含tom”);

}

}

}

validate()是对所有方法进行校验

validateXXX是对XXX方法进行校验

9.使用struts控制文件上传

1.struts默认采用common-FileUpload上传

2.完成上传的action

表示层:

<s:form action=”” enctype=”multipart/form-data”>

<s:textfield name=”title” label=”文件标题”><br />

<s:file name=”upload” label=”选择文件”>

<s:submit value=”上传” />

</s:form>

action类

public class UploadAction extends ActionSupport

{

//封装文件上传域的属性

private File upload;

//封装上传文件类型的属性

private String uploadContentType;

//封装上传文件名的属性

private String uploadFileName;

public String excute()

{

FileOutputStream fos= new FileOutputStream(path+”\\”+getUploadFileName());

FileInputStream fis= new FileInputStream(upload);

byte[] buffer=new byte[1024];

int len=0;

while((len=fis.read(buffer))>0)

{

fos.write(buffer,0.len);

}

return success;

}

}

3.上传文件的手动过滤

手动实现,写一个方法,这个方法名可以是任意的

public String filterType( String [] types)

{

for(String type:types)

{

if(type.equals(getUploadContentType()))

{

return null;//如果允许上传,则返回null

}

}

return error;

}

private String allowTypes;//这个允许的类型可以在struts.xml的action中通过params属性配置

public validate()

{

Strng filterResult=filterType(getAllowTypes().split(“,”));

if(filterResult!=null)

{

addFieldError(“upload”,”上传的文件类型不正确”);

}

}

4.上传文件的拦截器过滤

配置fileUpload拦截器,不仅可以过滤文件类型,还可以过滤文件大小

<action name=”” class=””>

<interceptor-ref name=”fileUpload ”>

<param name=”allowedTypes”> image/gif,image/png</param>

<param name=”maximumSize”>2000</param>

</interceptor-ref>

<interceptor-ref name=”defaultStack” />

</action>

10.使用struts控制文件下载

指定stream类型

10.1实现文件下载的Action

public class FileDownloadActon extends ActionSupport

{

private String inputPath;//该属性可以在配置文件中动态指定

public InputStream getTargeFile() throw Exception

{

return ServletActionContext.getServletContext().getResourceASStream(inputPath);

}

}

10.2action的配置

<action >

<result name=”success” type= “stream”>

<param name=”contextType”> image/jpg</param>

<param name=”inputName”>targeFile</param>//返回inputstream的getTargeFile()方法去掉get,首字母小写

<param name=”contentDisposition”>filename=”1.jpg”</param>//指定下载的文件名

<param name=”bufferSize”>4096</param>//下载文件的缓存大小

</result>

</action>

11.struts的拦截器机制

struts的大部分功能是由拦截器来完成的,大大增强了扩展性和灵活性

在struts-default,xml有很多默认的拦截器

拦截器的配置

<interceptor name= class=/>

有时候需要参数

<inttercepter name= class= >

<param name=> value</param>

</intercepter>

多个拦截器组成拦截器栈

<interceptor-stack name=””>

<interceptor-ref name=””>

<interceptor-ref name=>

</interceptor-stack>

自定义拦截器

1.拦截所以方法的拦截器

1). 继承AbstractInterceptor类 重写intercept()方法

public class SimpleInterceptor extends AbstractInterceptor

{

public String intercept( ActionInvocation invocation)

{

LoginAction action =(LoginAction) invocation.getAction();//获得Action实例

要执行的代码

....

String result=invocation.invoke();

return result;

}

2.)使用拦截器

通过<interceptor>定义拦截器

通过<interceptor-ref> 使用拦截器

<package >

<interceptors>

<inteceptor name=”mysimple” class=”my.SimpleInterceptor”>

</interceptors>

<action >

<interceptor-ref name= “defaultStack”/>

<interceptor-ref name=”mysimple” />

</action>

</package>

}

2.拦截某个方法的拦截器

继承MethodFilterInterceptor类 ,重写doIntercept()方法

<action >

<interceptor-ref name= “defaultStack”/>

<interceptor-ref name=”mysimple” >

<param name=”excludeMethods”> excute,haha</param> //excute haha这两个方法不被拦截

</interceptor-ref>

</action>

拦截器的执行顺序

先配置的先执行

在action的控制方法执行之前,位于拦截器链前面的先执行,在控制方法之后,拦截器链前面的方法后执行

拦截器的应用 :用拦截器完成权限的控制

12.struts的ajax支持

1.使用stream类型的result实现ajax

一个实例:实现ajax的登录实例

pulic class LoginAction implements Action

{

private String name;

private String password;

private InputStream inputStream;

public String excute()

{

inputStream= name.equals(“tom”)&&password.equals(“123”)

?new ByteArrayInputStream(“恭喜你登录成功”).getBytes(“utf-8”)

:new ByteArrayInputStream(“对不起,用户名或者密码不匹配”).getBytes(“utf-8”);

returne success;

}

}

在struts.xml文件中配置如下:

<action name=”loginpro” class=””>

<result name=”success” type=”stream”>

<param name=”contextType”>text/html</param>

<param name=”inputName”>result</param>

</result>

</action>

login.jsp中



2.使用json完成ajax

json javaScript 对象符号

json是一种数据交换格式,

JSON有两种数据结构

1)key-value型 : 在js中是一种对象,在java中是一个map结构,在C语言中是一种struct

2)有序集合 可能有list 数组 等实现

在javaScript中有两种格式,一种用来创建对象,一种用于创建数组

创建对象: var p={ name:’tom’, sex:’male’}

创建数组: var a={ ‘tom’,’lily’};

使用json插件完成ajax

struts.xml

<package name=”” extends=”json-default”>

<action name= ‘’class=”” >

<result type=”json”>

<param name=”noCache”>true</param>

<param name=”contextType”>text/html</param>

</result>

</action>

</package>



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: