




已阅读5页,还剩14页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一、 Struts2开发前期1、 文件下载 从Apache官方网站下载Struts2的文件(/2.1.6/index.html) struts-2.0.14解压后包含了5个文件夹,如下是针对五个文件的说明: apps: Struts2的一些例子,可以再Tomcat部署运行. docs: Struts2所有的帮助文档. lib: 包含了Struts2所有的的.jar包已经它以来的第三方.jar包 src: 源代码. J4: 对jdk1.4 的支持文件2、 主要用到的jar包 Struts2-core-2.x.x.jar :struts2框架的核心类库 Xwork-2.x.x.jar:Xwork类型 Ognl-2.6.x.jar:对象图导航语言, struts2框架通过其读写对象的属性 Freemarker-2.3.x.jar: struts2的UI标签的模板使用Freemarker编写 Commons-lodding-1.1.x.jar:ASF出品的日志包, struts2框架使用这个日志包来支持Log4j和JDK1.4的日志记录 Commons-fileupload-1.2.1.jar文件上传组件,2.1.6版本后必须加入此文件 commons-logging-1.0.4.jar日志jar包3、jar包及项目的是配置n 将jar包复制到web项目的web-inf-lib文件夹下n web.xml中添加: struts2 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter struts2 /* 备注:org.apache.struts2. FilterDispatcher 解释:struts2读取到struts.xml的内容后,以javabean形式存在内存中,以后struts2对用户的每次请求处理将使用内存中的数据,而不是每次都读取struts.xml文件。二、 jsp页面数据通过action校验实例1、 建立一个jsp文件,里面有用户名,密码框。Jsp文件中引入标签-用于显示后台返回的信息以下写在body中:根据action的返回结果,显示验证信息 用户名: 密码: 2、 编写Action类ValidationLogin.java,此Action类必须继承ActionSupport类l Action类中的变量必须跟jsp页面中form提交的变量名相同。l 每个变量必须是有getter和setter方法。l Validate()方法对form表单提交的参数进行验证。public void validate()if(isNull(username)/fieldError可以在前台取得显示出来this.addFieldError(username, 用户名不能为空);if(isNull(password)this.addFieldError(password, 用户密码不能为空);l 也可以定义成功后的方法,通过在form表单的forward路径中指定方法。例如:在action类中添加方法;public String save()/通过这种方式,前台可以通过request对象获取message信息。ActionContext.getContext().put(message, 保存成功);return message;备注:ActionContext详解在第二节最后在jsp页面的action中就要这样写:3、在struts.xml中配置action类.l 首先在src包下创建struts.xml文件,通用内容如下:配置ValidationLogin类;/struts2中的配置具有继承关系,可以定义namespace,跳转的时候就会先到namespace下的package中查找action的配置方法,如果找不到就到父类中,每个package都必须继承”struts-default”packageNamespace书写格式:namespace=/yanzheng下面的配置中我没有使用namespace,因为小例子就不需要分这么多包了/下面name自己定义,前台jsp页面跳转的时候就到这个name/result就是此类返回的信息,如果用户名和密码都输入了,name就从save方法中返回了“message”信息。/message.jsp/如果没有通过验证,那么就返回验证信息到jsp页面,input是固定写法/index.jsp到这一步,这个例子就讲完了,下面是ActionContext解释:为了避免与Servlet API耦合在一起,方便Action类做单元测试,Struts 2对HttpServletRequest、HttpSession和ServletContext进行了封装,构造了三个Map对象来替代这三种对象,在Action中,直接使用HttpServletRequest、HttpSession和ServletContext对应的Map对象来保存和读取数据。 l (一)通过ActionContext来获取request、session和application对象的LoginAction1ActionContext context = ActionContext.getContext();Map request = (Map)context.get(request);Map session = context.getSession();Map application = context.getApplication();request.put(greeting, 欢迎您来到程序员之家);/在请求中放置欢迎信息。session.put(user, user);/在session中保存user对象application.put(counter, count);在JSP中读取$sessionScope.user.username,$requestScope.greeting。本站的访问量是:$applicationScope.counterl (二)直接使用ActionContex类的put()方法ActionContext.getContext().put(greeting, 欢迎您来到http:/www. );然后在结果页面中,从请求对象中取出greeting属性,如下:$requestScope.greeting 或者 三、 拦截器继承AbstractInterceptor类重写intercept方法四、OGNL表达式1、OGNL的全称是Object Graph Navigation Language(对象图导航语言),它是一种强大的表达式语言,让你通过简单一致的表达式语法来读取和设置Java对象的属性值,调用对象的方法,遍历整个对象的结构图,实现字段类型转换等功能。ognl表达式是对象图导航语言,struts2使用ognl作用为默认的表达式语言。a) 支持对象方法调用,如xxx.sayHello();b) 支持类静态方法调用和值访问,表达式的格式【类全名(包括号路径)】【方法名| 值名】,例如:java.lang.Stringformat(foo %s,bar)或cn.itcast.ConstantAPP_NAME;c) 操作集合对象2、关于OGNL更通俗的讲法 OGNL的两个最基本的概念:*表达式(expression)* 和 *上下文(context)*,我们先看*表达式*。 表达式 OGNL就是表达式!它能让我们用简洁直观的语法表达我们的想法,如同上面的例子一般。简洁直观就是表达式的最大优点!我们知道表达式总是有一个结果,也就是说表达式总是会求值出一个结果,这个结果可能是一个字符串(如名称、组织机构代码证号等),或者是一个布尔值(如是否是VIP客户等),至于这个结果要怎么使用,那就是我们自己来决定的了。 上下文(context) 表达式的概念,我相信很好理解,但什么是上下文(context)?简单来说上下文就是环境,表达式求值的环境!还是不理解吗?我们来看一个例子: 还是上面最后那个例子:Java代码 name细心的你是否会问,这个表达式要取谁的姓名呢?OK,很好!这就是环境,谁就存在于环境之中,也就是存在上下文之中。对于不同的环境/上下文,相同的表达式会有不同的结果!而环境/上下文的实质是什么呢?就是一组带名称的对象集合。 我们可以指定user为环境中的特权对象,访问该对象可以不需要使用#user的方式,如下所示代码与上面的完全等价,当然,前提是要预先指定user为特权对象: Java代码 name / 取用户的姓名 age / 取用户年龄 birthday / 取用户生日 / 取用户所属客户的名称 #request.parameters / 取请求参数 我们上面所说的特权对象在OGNL中称为根对象(root) 综上所述,理解OGNL表达式的关键是理解其上下文的概念,因为OGNL的上下文概念中引入了“根对象”的概念 。 struts2中的OGNL上下文 struts2对OGNL上下文的概念又做了进一步扩充,在struts2中,OGNL上下文通常如下所示: Java代码 |- application | |- session | context map-|-OgnlValueStack(root) user, action, OgnlUtil, . | |- request | |-parameters | |- attr 我们可以使用#request访问HttpServletRequest对象, #session访问HttpSession对象,但请注意根对象是什么?是ValueStack! 那么ValueStack是什么?值栈。也就是一组对象的堆栈3、 实例:使用之前首先要引入标签struts-tags -生成一个list对象- -生成一个map对象- = -in和not in表达式- 在 不在 不在 在 -其他访问对象方式-除了in和not in 之外,OGNL还允许使用某个规则获得集合对象的子集,常用的有一下3个相关操作符。?:获得所有符合逻辑的元素。:获得符合逻辑的第一个元素;$:获得符号逻辑的最后一个元素。例如:Books为一个对象list集合,通过action传递过来,详细例子见ognl项目/获取价格大于70的书籍 60 价格 4、 符号使用l %计算ognl表达式的值l $用法1) 在国际化资源文件中引用ognl表达式 10 100 BAction-test校验:数字必须为$min为$max之间! 2) 在struts2配置文件中应用ognl表达式 ListPhotos.action?albumId=$albumId 3)于再jsp文件中的配置对比标签中:配置文件中:/main.jsp?name=$name 5、ognl访问举例 调用值栈中属性: 调用Action中的静态方法: 调用JDK中的类的静态方法:等同于: 调用值栈中对象的普通方法: 调用普通类中的静态属性:注意属性不能声明为私有的即private 调用普通类的构造方法: 获取List: 获取List某一元素: 获取Set: 获取Map: 获取Map中某一元素: 注意:在OGNL中可以使用如上形式:classNamefield or method调用静态变量或方法。 Set由于是无序的,所以不能使用下标获取数据。 访问静态方法 注意,两个是约定.也就是必须这么写.第一个后面跟的是类的全名.第二个后面跟的是对应的方法名.当然,这个方法必须是静态的 这个访问静态方法在struts2.1以后的版本里面需要设置一个属性,否则系统默认是不支持访问静态方法的(struts2.0版本默认是支持访问静态方法的).具体的方法是在struts.xml里面添加这么一句 5、 url标签1)-namespace为所在的包名-传递的参数2)6、checkboxlist复选框 List集合:Map集合:javaBean对象: 7、表单标签radioList集合:Map集合:Bean对象:8、Select复选框集合是List集合是Map五、文件上传1、单个文件上传l 项目中要包含commons-fileupload.jar和commons-io-1.3.2.jarl Jsp文件书写格式 文件: 备注:enctype必须加上,file的name名和action中的name名必须相同l Action类书写格式public class UpfileAction private File image;/file名必须和上传的文件名相同/下面定义文件名中,格式必须为:image+FileNameprivate String imageFileName;public File getImage() return image;public void setImage(File image) this.image = image;public String getImageFileName() return imageFileName;public void setImageFileName(String imageFileName) this.imageFileName = imageFileName;public String execute() throws Exception/得到真正路径String realpath=ServletActionContext.getServletContext().getRealPath(/images);System.out.println(realpath);if(image!=null)/创建目录对象File savefile=new File(new File(realpath),imageFileName);/创建目录if(!savefile.getParentFile().exists()savefile.getParentFile().mkdirs();FileUtils.copyFile(image, savefile);/上传成功提示ActionContext.getContext().put(message, 上传成功!);return message;l 配置文件Struts.xml文件中:/index.jsp备注:若要控制上传文件的大小,则在配置文件中加入:2、 多个文件上传public class UpFilesAction private File image;private String imageFileName;public File getImage() return image;public void setImage(File image) this.image = image;public String getImageFileName() return imageFileName;public void setImageFileName(String imageFileName) this.imageFileName = imageFileName;public String execute() throws ExceptionString realpath=ServletActionContext.getServletContext().getRealPath(/images);System.out.println(realpath);if(image!=null)File savedir=new File(realpath);if(!savedir.exists()savedir.mkdirs();for(int i=0;iimage.length;i+)File savefile=new File(savedir,imageFileNamei);FileUtils.copyFile(imagei, savefile);ActionContext.getContext().put(message, 上传成功);return message;六、标签防止表单重复提交1、在表单中加入token标签 姓名: 备注:namespace为package的命名空间2、添加action类此处在包下添加了一个TokenAction类,在这个类的execute方法中只返回一个message字符串就行。(因为此处就讲讲token的用法,所以就简单一说就行)3、在struts.xml文件中配置/login.jsp/success.jsp备注:1.调用任何过滤器前都要先调用defaultStack过滤器。2. /login.jsp的含义是当出现重复提交时,返回到login.jsp页面。3、invaid.token页面打印错误信息,一样可以使用struts标签。如下: 七、自定义类型转换器(以日期类型为例)Web应用程序交互都是建立在Http之上,互相传递的都是字符串,因此需要进行类型转换1、继承StrutsTypeConverter类该类是DefaultTypeConverter的实现类,对DefaultTypeConverter进行了扩展。2、StrutsTypeConverter中核心的两个方法:convertFromString()和convertToString()两个方法。3、局部类型转换和全局类型转换局部类型转换分为:l 普通实体bean:在对应的Action同级目录下创建action名-pertiesl 基于领域模型:不仅需要在对应的action目录下创建action名-pertiex文件,还需要在引用模型同级目录下创建properties文件,取名规则:引用名-perties例如:在User类中有一个Point对象的引用,Point和User之间的关系就是领域模型,在这里我们要基于Point做自定义类型转换。对应的action为PointAction:public class UserAction extends ActionSupportprivate User user;/省略set get方法Overridepublic String execute() throws Exception return super.execute();对应的转换类PointConvertor:public class PointConvertor extends StrutsTypeConverter/*从表单中的string到Point对象* 我们约定以,来分隔这里为了严谨期间最好要进行输入数据的验证*/Overridepublic Object convertFromString(Map context, Stringstr, Class c) Point point=null;if(str!=null|str.length0)String s=str0.split(,);point=new Point();int x=Integer.parseInt(s0);int y=Integer.parseInt(s1);point.setX(x);point.setY(y);return point;/* 从对象到字符串*比如页面输出*/Overridepublic String convertToString(Map context, Object o) Point point=(Point)o;return (+point.getX()+,+point.getY()+);在UserAction同级目录下配置UserAperties#目标转换对象=转换器user.point=com.dl.convertor.PointConvertor在User类的同级目录下创建Uperties文件point=com.dl.convertor.PointConvertor全局类型转换:在classpath下新建文件perties(固定名称)其内容为:目标转换对象=转换器类(包名+类名)八、FreeMarker标签1、freemarker不是web应用框架,他是web应用框架中的一个组件。Freemarker是一种基于模板的,用来输出文本的通用工具。通俗而言:freemarker=模板(.ftl文件)+数据模型(存放方式类似一颗大树,数据就是传递到这个模板的数据)。Freemarker标签是区分大小写的。2、l $:花括号内的变量的值会显示出来。l FTL tags标签:freemarker标签一般使用符号#开头,用户自定义的ftl标签使用符号来代替#号,和directives指令含义相同。例如:l Comments注释:#-*-3、常用指令:l If指令格式: 例如:如果传过来的用户名是shirley,那么输出if中的话。$username, our beloved leader 如果蟒蛇的价格为零,那么输出“今天蟒蛇免费”Pythons are free today!l List指令:遍历集合的内容,显示一个列表。比如数据模型fruits下有两条数据”apple”,”orange”;那么遍历fruit方法。$fruitInclude指令l 插入其他的内容到当前模板例如:l 联合使用指令: $ $being.price Euros 4、处理不存在的变量对于freemarker模板而言,当某个变量没有做不存在处理时,模板会以“未定义的变量”错误而终止模板,为了防止这种情况的发生,需要给变量制定默认值,或者判断变量是否存在后再读取。l 设定默认值:welcome $user!”shirley”当变量user为null的时候,默认显示为“shirley”备注:(?处理方式同样适用) 1)如果默认值被省略,那么结果是空串、空序列或空哈希表($mouse!)输出()2)product.color!”red”:当color不存在时输出”red”,但是此处当product也不存在时就会出错.所以写的时候应写成:(product.color)!”red”3)将会解释为,那就是说b=y将会视为是比较运算,然后结果作为x的默认值。而不是想要的参数b是x的默认值,为了避免这种情况,如下编写代码:。l 通过放置?在变量后,判断变量是否存在welcome $user6、 FTL模板Ftl忽略表达式中的多余空格。模板中都包含什么?Text文本:原样输出。Interpolation插值:$或者#,输出括号内的值。FTl tag标签:例如标签等Connents标签:注释标签。例如:我们来看一个具体的模板,其中的内容已经用颜色来标记了:文本,插值,FTL标签,注释,为了可视地看到换行符而使用了BR。 BR BR Welcome!BR BR BR BR Welcome $user!BR We have these animals:BR BR BR $ for $being.price EurosBR BR BR BR 备注:ftl标签不可以插入ftl标签或者插值中使用。#if =bar.-错 注释可以插入ftl标签或者插值中使用。7、 转义字符可以直接用在模板中,也可以用在Interpolation插值中。 引号(u0022) 单引号(又称为撇号)(u0027) 反斜杠(u005C) n 换行符(u000A) r 回车(u000D) t 水平制表符(又称为标签)(u0009) b 退格(u0008) f 换页(u000C) l 小于号: a 和号:& xCode 字符的16进制Unicode码(UCS码) 8、 Interpolation插值插值仅仅在两个地方使用,文本区和字符串表达式中,一定不能在插值内使用插值。文本区:Hello $name!字符串表达式中:l 连接:在$中使用$: $Hello $user!$user$user$user$user使用+号:$Hello + user + ! $user + user + use
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 时装店入门知识培训方案课件
- 合同管理模板包含风险评估与条款审查功能
- 蓝色科技人工智能日常运用
- 人教版三年级上册第六单元6.1.2《几分之几》课时练(含答案)
- 绿色简约手绘环保公益讲座
- 商业照明设计与安装合同书
- 如何理解诗经中的情感表达:高中诗歌教学计划
- 纪念白求恩李红玲课件
- 企业品牌推广与宣传方案制作工具包
- 2025年软件测试设计师全国计算机技术与软件专业技术资格(水平)考试试卷
- “李可中医药学术流派论治厥阴病”-课件
- 通用技术作品设计报告
- JJF 1847-2020 电子天平校准规范-(高清现行)
- 人工智能遥感解译介绍课件
- 大信审计执业问题解答-存货监盘审计指引
- 锚杆支护技术规范正式版本
- 婚育情况证明
- 下一代互联网技术
- 皮肤知识与问题性皮肤分析(入行必看)
- 单位消防安全评估报告(模板)
- 江西之江化工“7.2”压力容器爆炸事故
评论
0/150
提交评论