




已阅读5页,还剩15页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
方法二:适合多个表单需要完成不同的功能时使用方法三:适合一个表单多个提交按钮,每个按钮对应一个方法struts 2 工作在表现层 action jsp 页面hibernate工作在dao层, 简化数据的增删改查spring用来整合其他框架,用来简化事务的管理框架(framework)的目的:为了提高开发效率,减少重复代码= day 1 =1. MVC 模式, struts2 是实现了MVC模式的一个框架Model 模型= 数据以及操作数据的逻辑, 对应着entity(实体类部分)指数据对应着service(业务逻辑部分)View 视图 = 数据的展现方式jsp页面, 用来展现数据Controller 控制器= 连接了模型和视图职责:接收请求参数调用模型将结果(模型的数据部分)存入作用域转发(或重定向)到视图struts2: 能够实现通用的类型转换操作能够统一执行汉字字符的转码执行参数的验证.MVC的优点:分离了模型和视图, 让代码各司其职,耦合度降低,可维护性提高2. struts2 的使用步骤目录结构apps 下是示例代码docs 下是文档lib struts提供的jar包,以及它依赖的第三方jar包src 是源代码2.1 添加jar包 struts 2.3.16需要添加13个jar包ognl-3.0.6.jar提供了OGNL表达式的功能struts2-core-2.3.16.jarstruts2 核心包xwork-core-2.3.16.jarstruts 1 (mvc框架)webwork(mvc框架)xworkstruts 2 = 从struts 1 以及 webwork发展而来,结合了两个框架的优点2.2 控制器部分1) 前控制器 (已提供)控制所有请求,进入前控制器,再由前控制器将请求进行分发处理在web.xml 进行配置:struts2org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilterstruts2/*2) 后控制器 (指Action类)可以继承ActionSupport (action支持类)必须有无参构造方法action方法的返回值必须是String, 名字任意,无参3) 配置action类配置文件的路径: src配置文件的名字: struts.xmlDTD 是一种xml定义文件定义了xml中有哪些标签标签中有哪些属性标签之间的父子关系2.3 视图部分!- 配置视图 name=视图名 在action标签内要唯一jsp的路径/开头的路径,叫绝对路径,/就是指 WebRoot内部默认使用了forward 转发方式跳转到了jsp-/1.jsp/2.jspaction方法的返回值代表视图的名字2.4 如何接收请求参数方法1:(传统方法) (工具类,struts提供)HttpServletRequest request = ServletActionContext.getRequest();request.getParameter(参数名);ServletActionContext.getResponse();/ 获得响应ServletActionContext.getServletContext(); / 获取application作用域方法2:(推荐使用)只要将请求参数名字与action的属性名相对应,那么,struts就会将参数值赋值给action的属性请求参数中,struts支持常见类型的类型转换,如:String , Double (double), Integer (int), .java.util.Date如果只有年月日: 年-月-日如果有年月日和时分秒: 年-月-日T时:分:秒还可以支持实体类型的赋值,如User对象支持List集合类型2.5 如何将结果存入作用域,并在页面显示方法1: (传统)仍然利用request对象,将变量存入作用域HttpServletRequest request = ServletActionContext.getRequest();request.setAttribute(list, list);方法2:(推荐)可以认为:action里的属性,同时被存储在了request作用域中例如:action有一个list属性, 到了页面上 用$requestScope.list来获取此属性值注意:action的属性两个作用:一是用来接收请求参数二是将结果存储至request作用域2.6 struts中对于post请求中解码,默认字符集为UTF-8如果页面采用了GBK编码,需要在struts.xml中添加:如果是get请求中出现了中文乱码:要修改tomcat/conf/server.xml作业:使用struts实现登录功能= day 2 =1. 向其他作用域存值方法1:(传统)HttpServletRequest request = ServletActionContext.getRequest();HttpSession session = request.getSession();session.setAttribute(变量名, 值);ServletContext application = ServletActionContext.getServletContext();application.setAttribute(变量名, 值);方法2:利用了SessionMap, ApplicationMapMap session = ActionContext.getContext().getSession();session.put(name, 张三); / 相当于 session.setAttribute(name, 张三);session.get/ 相当于 session.getAttribute(key);session.remove/ 相当于 session.removeAttribute(key);是SessionMap这个实现提供的,不是map接口中定义了session.invalidate/session.invalidate(); 使session立刻失效Map application = ActionContext.getContext().getApplication();application.put(变量名, 值);2. 值栈 【重点】ValueStack是struts2独有的,用来在action和页面之间进行传值的一种作用域分为两部分:Root 根Context上下文2.1 Root 它的数据结构上是一个栈结构类似于List, 符合后进先出ValueStack vs = ActionContext.getContext().getValueStack();vs.push(对象); / 将对象放入valueStack的Rootvs.peek();/ 获取栈顶对象, 但不移除vs.pop();/ 获取栈顶对象, 并移除页面上使用的标签【重点】 / 获取整个栈顶对象 / 获取栈中对象的属性, 会依次查找栈中每个对象的属性 用来调试的标签, 能够显示值栈的结构结论: 即使不主动调用push方法,struts也会将当前访问的action对象放入栈中因此,也可以使用来显示action对象的属性值下面的两种方法,都可以用来显示action中的属性值:【重点】$requestScope.属性名这里struts对原始的request对象做了包装,改写了getAttribute方法页面上用的 requestScope 已经是struts包装后的request对象了/ key = usernamepublic Object getAttribute(String key) Object value = 原始request.getAttribute(key);if(value != null) / 有,直接返回return value;/ 如果原始的request中没有,到值栈中找ValueStack vs = ActionContext.getContext().getValueStack();return vs.findValue(key); / 在root找此属性ValueStack的作用范围:仅限于一次请求, 跟request作用域一样Action的作用范围:一次请求,每次请求来了后都会创建新的action对象2.2 Context 部分它的数据结构是一个map, 已经有一些预定义的键值对了:keyvaluerequestRequestMapkeyvaluesessionSessionMapkey valueapplicationApplicationMapkeyvalue存值:ValueStack vs = ActionContext.getContext().getValueStack();vs.getContext().put(key, value);还可以间接存入sessionMap,或applicationMap取值:加了#表示要从context中找,没加#表示从root中找3. struts中的常见标签 用来显示值加了#表示要从context中找,没加#表示从root中找key属性名3.1 迭代标签 3.2 条件标签 作业:登录=success.jsp 加一个超链接1. 查询当前用户的联系人, 在页面使用struts的标签配合显示nullnullnullpublic List findContacts(String name, String qq, Integer cityId, String username, int pageNo, int pageSize);username=联系人对应的用户名pageNo= 1 (页号)pageSize = 5 (每页的记录数)= day 3 =1. 视图的类型用来控制action的跳转跳转的目标type=dispatcher 跳转的目标只能是jsp(默认值)底层使用了请求转发type=redirect跳转的目标可以是action也可以使jsp 底层使用了重定向type=redirectAction跳转的目标只能是action底层使用了重定向type=chain跳转的目标只能是action底层使用了请求转发 (不推荐)1.1 redirect格式1:(简化写法)/homework/findContact格式2:(完整写法)/homework/findContact1.2 redirectAction!- 如果要重定向的action在同一个namespace 下,可以省略配置-/homeworkfindContact注意:java.lang.OutOfMemoryError: PermGen space 【内存耗尽错误】只能重新启动tomcat服务器所有的action有一个默认后缀.action, 可加可不加1.3 chainnamespace的值action的名字2. 掌握城市名字的显示(利用了map集合)注意:严重: IOException while loading(加载) persisted(持久化) sessions: java.io.EOFExceptionjava.io.EOFException3. 掌握多条件组合查询的实现a. sql语句的拼接b. 条件参数的传递4. 掌握条件查询,输入条件的回显 (文本框、下拉列表)5. 分页服务器端:通过sql语句进行分页oracle = 通过 rownum 配合子查询实现select * from (select e.*, rownum r from (select * from . 500) ewhere rownum (pageNo-1)*pageSizepageSizepageNo每页10条, 要查询第二页11-205.1 如何计算总页数int count = 13; / 总记录数int pageSize = 5;/ 每页记录数方法1:if(count % pageSize = 0)count / pageSize;/ 2 else count / pageSize + 1; / 3方法2:(count-1)/pageSize+1作业:1. 实现课堂的分页例题 (必做)2. 在此基础上,上一页、下一页、第一页、最后一页3. 百度的分页实现总共1000 每页5条 共有200页1 2 3 4 5 6 7 8 9 10第1页1 2 3 4 5 6 7 8 9 10第2页.2 3 4 5 6 7 8 9 10 11第7页3 4 5 6 7 8 9 10 1112第8页.= day 4 =1. OGNL 表达式EL 表达式对象 图 导航 语言User 对象 Rootusernameaddresscitystreetpostcoderequest.setAttribute(user, user);$ user.address.street 用途: 用来获取值栈作用域中的变量值跟EL表达式的区别:1) OGNL 只能配合struts标签使用,不能单独使用2) OGNL中可以调用对象的方法, EL只能调用get,set方法,不能调用其它方法3) OGNL中可以创建对象OGNL 创建普通java对象:new 包名.类名()OGNL 创建map: #key1:value1, key2:value2 .OGNL 创建list: value1, value2, . 2. struts中其它常用标签1)日期标签 2)namespace=要执行action所在的命名空间name=要执行action的名称executeResult=true|false 是否要包含action执行的视图结果var=变量名会将加了var的action放入context作用域用途:a) 起到include的作用,包含其他action结果b) 将重复的代码集中在同一个action,用标签来引用它jsp:include动态包含jsp,html, servlet% include静态包含jsp, htmlUser Rootusername本质上 getUsername()3) 跟表单相关的标签formselects:select好处: 提供的表单数据的“回显”功能 能够生成表格来对齐每个表单项 s:form 能够自动添加项目名%中的内容会被struts当做ognl表达式解析3. struts中action的路径的匹配方式简化action配置的方法方法1:DMI(动态方法调用) dynamic method invoke1)启用DMI调用2) 3) 访问action时在action的路径后 加 !方法名方法2:使用*通配符来实现简化/day4/1.jsp4. 默认命名空间当namespace的取值= 或 =/ 或省略 namespace 则称为默认命名空间默认命名空间下的action访问时,路径:项目名+action的名特点:1. 整个项目中只能有一个默认命名空间2. 如果在其他命名空间下没有找到某个action, 会在默认命名空间下再找一遍5. 全局视图如果action的视图名与全局的视图名一样,优先采用action的视图 在action中找不到对应的视图时,才会在全局视图中查找6. 异常处理 RuntimeException - ArithmeticExceptionException - IOException -7. 表单数据的有效性验证客户端验证使用 js来进行验证,发生在表单提交之前更为及时,能够更早检查数据是否有效,有可能被绕过服务端验证使用 action来进行验证, 发生在表单提交以后更为可靠struts提供服务器端验证的方法:1) 在action类中重写validate方法,仍需要写java代码2) 将验证规则写在xml配置文件中,不需要写java代码3) 通过注解(标注)来实现验证 Annotationstruts提供的用来验证的注解,每个注解代表一种验证规则1 准备工作:action类要继承ActionSupport的父类2 选择一种验证规则,例如:RequiredFieldValidator(message=出现错误时的提示信息)3 如果验证通过,会进入execute方法如果验证没有通过,会跳转到一个名为input的视图4 显示错误信息常见的验证注解:RequiredFieldValidator 只能验证请求参数有没有,不验证参数的实际值RequiredStringValidator 必须有此请求参数,而且请求参数必须有值StringLengthFieldValidator 用它来控制字符串参数的长度minLength maxLengthIntRangeFieldValidator(min=18, max=60, message=年龄必须是18-60之间)验证整数的取值范围EmailValidator 验证邮件地址FieldExpressionValidator(expression=pass1 = pass2, message=两次输入的密码不一致)根据一个OGNL表达式进行验证, 如果OGNL返回true表示验证通过,否则验证失败RegexFieldValidator(regex=a-zA-Zw3,$, message=您的name必须首字母必须是字母,长度必须是4个字符以上)根据一个正则表达式进行验证作业: 1) 添加联系人 (必须做)对联系人的属性进行验证:name 必填qq 选填,但必须是数字email 选填,必须是合法邮件地址phone必填,必须是合法的收集号cityId可以选填 2) 修改联系人,删除联系人(选作)删除前需要确认= day5 =1. 文件上传1) 表单要求表单数据由多部分组成2) action类private File aaa;/ 文件对象,临时的private String aaaFileName; / 文件的原始文件名3) 将临时文件另存FileUtils.copyFile(原始文件, 目标文件);问题1:建议将上传的图片放在webapps中不会轻易删除的目录中问题2:如何保证上传的文件命名不冲突文件的签名(指纹)其中比较常用:md5签名特点:不管文件有多大,签名结果是固定的16个字节 签名的结果不可逆 通过:commons-codec-1.9.jar (里面包含了加密,解密,签名等工具类 )结论:MD5的签名值可以唯一这个文件,可以利用它作为唯一的文件名另一用途:可以用作密码的加密处理,让其他人看不到密码的明文注意:上传的文件仍然是建议存储于磁盘上,数据库中只是存储文件的路径+文件名2. 实现图片的预览使用XMLHttpRequest, 可以实现异步上传,并提供预览功能(预览方法之一)3. = day 5下午 =4. 拦截器 Filter 过滤器 (web 标准组件)Interceptor拦截器(struts中提供,功能与过滤器相近)4.1 类需要实现 Interceptor接口, 并实现一个intercept方法4.2 配置拦截器.4.3 拦截器中如果调用ActionInvocation.invoke 表示请求放行,否则表示请求被拦截4.4 拦截器方法的返回值,代表当请求被拦截时,要跳转的视图名这个返回值只有在请求被拦截时才有效,如果请求放行,它就没有意义了4.5 拦截器栈每个action可以直接引用拦截器栈4.6 默认引用拦截器:如果加了 就以它引用的拦截器为准如果没有 才会使用默认的拦截器4.7 如果定义自己的拦截器,一般需要和系统提供的一个名为defaultStack
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 校园卫生清扫管理制度
- 校园宣传设施管理制度
- 校园日常出入管理制度
- 校园消防水井管理制度
- 校园监控设备管理制度
- 校园配套设施管理制度
- 校外培训财务管理制度
- 神经递质代谢研究-洞察及研究
- 海水鱼苗快速培育-洞察及研究
- 医疗用品包装标准
- 英语四级单词表TXT
- 红星照耀中国1-6章练习汇编(含答案)
- 债权登记申报表
- DB15T 2763-2022一般工业固体废物用于矿山采坑回填和生态恢复技术规范
- 产能验证分析报告
- Unit2Thestoneintheroad读写课件-高中英语人教版必修第三册
- 绕圆柱无环量流动和有环量流动流线分布图
- DB32∕T 2914-2016 危险场所电气防爆安全检测作业规范
- 中国海洋大学论文封面模板
- HY∕T 122-2009 海洋倾倒区选划技术导则
- 企业项目计划书和研究开发项目目立项决议文件参考格式.docx
评论
0/150
提交评论