struts2基础知识

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>

时间: 2024-10-11 11:26:59

struts2基础知识的相关文章

Struts2 基础知识

Struts2   基 础 知 识 一.Struts2的综述 struts1是Servlet的实现! Struts2是filter实现(拦截interceptor)!满足MVC框架! 注:MVC为项目的设计模式(通常符合低耦合高内聚)   M:model -- 模型层      封装数据类型 -- entity      完成数据源的交互 -- dao      封装业务逻辑 -- service      辅助工具类 -- util  V:view -- 视图层     显示数据     采集

Struts2 基础知识学习

JAVA web开发历史 早期的Java Web应用中,Jsp文件同时负责生产网页,控制到下一个网页的流程,以及负责业务逻辑, 这给web开发带来一系列问题: HTML和Java耦合在一起,JSP文件的编写者必须是网页设计者,又是Java开发者. 缺点: 可读性差 调试困难 不利于维护,更改业务逻辑或者数据可能设计多个相关网页 现在通常分为四层: 表述层(JSP,HTML页面) 业务逻辑层(JavaBean) 持久化层(spring实现持久化) 数据库层 分层的优点: 可伸缩性 可维护性 可扩展

Struts2基础知识(三)

本文主要包括以下内容 OGNL表达式 标签 防止表单重复提交 使用第三方插件 OGNL表达式 OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目.Struts2框架使用OGNL作为默认的表达式语言. 相对EL表达式,它提供了平时我们需要的一些功能,如: 支持对象方法调用,如xxx.sayHello(); 支持类静态方法调用和值访问,表达式的格式为@[类全名(包括包路径)]@[方法名|值名],例如:@[email protect

struts基础知识

1.框架 (1).是一系列jar包,其本质是对JDK功能的拓展. (2).框架是一组程序的集合,包含了一系列的最佳实践,作用是解决某一个领域的问题. 2.框架的作用:       框架强调的是软件的设计重用性和系统的可扩充性,以缩短大型应用软件系统的开发周期,提高开发质量.与传统的基于类库的面向对象重用技术比较,应用框架更注重于面向专业领域的软件重用 3.框架和设计模式的区别 有很多程序员往往把框架模式和设计模式混淆,认为MVC是一种设计模式.实际上它们完全是不同的概念. (1).  框架.设计

MySQL数据库基础知识

day02 MySQL数据库基础知识 一.基础知识概述: 基础决定你这门课程的学习成败!只有学习好这些基础知识以后,你才能真正的运用自如.才能够对数据库有更深入的了解,道路才会越走越远. 二.基础知识: 1.数据库(database):数据库就好比是一个物理的文档柜,一个容器,把我们整理好的数据表等等归纳起来. 创建数据库命令:        create database 数据库名; 2.查看数据库         show databases; 3.打开指定的数据库         use 

linux入门基础知识及简单命令介绍

linux入门基础知识介绍 1.计算机硬件组成介绍 计算机主要由cpu(运算器.控制器),内存,I/O,外部存储等构成. cpu主要是用来对二进制数据进行运算操作,它从内存中取出数据,然后进行相应的运算操作.不能从硬盘中直接取数据. 内存从外部存储中取出数据供cpu运存.内存的最小单位是字节(byte) 备注:由于32的cpu逻辑寻址能力最大为32内存单元.因此32位cpu可以访问的最大内存空间为:4GB,算法如下: 2^32=2^10*2^10*2^10*2^2 =1024*1024*1024

BroadcastReceive基础知识总结

BroadcastReceive基础知识总结 1.BroadcastReceive简介 BroadcastReceive也就是"广播接收者"的意思,顾名思义,就是用来接收来自系统和应用中的广播 在Android系统中,广播体现在方方面面,例如当开机完成后系统会产生一条广播,接收到这条广播就能实现开机启动服务的功能,当网络状态改变时,系统会产生一条广播,接收到这条广播,就能及时的做出提示和保存数据等操作,当电池的电量改变的时候,系统会产生一条广播,接收到这条广播就能在电量低的时候告知用户

基础知识--:before伪元素和:after伪元素

http://book.51cto.com/art/201108/285688.htm 3.7  替换指定位置 大家都知道before和after是前.后的意思.但是奇怪的是,CSS中的:before伪元素和:after伪元素是为源文档中不存在的内容设置样式的. 没有内容怎么设置样式呢?别急!它们有一个content属性,一起使用就可以为某个选择器前.后的内容设置样式了. 下面就来了解一下:before伪元素和:after伪元素的用法. 视频教学:光盘/视频/3/3.7  替换指定位置.avi 

20_Shell语言———VIM编辑器基础知识三之窗口属性定制、配置文件及查找替换功能

Vim编辑器可以让用户按照需求来定制一些使用属性. 一.窗口属性定义 1)显示行号 行号不是内容,只是用来帮助用户确认文本所在的行.在vim编辑器中,如果要显示行号,可以在末行模式下输入: set number 如果想关闭,则可以在功能名称前面加上no,即: set nonumber 命令可以被简写,如set number 可以简写为 set nu:set nonumber 可以简写为 set nonu. 注意,上述设定仅对当前vim的进程有效,一旦当前进程关闭,这些设定就会失效,如果要使设定永