1、 步骤4:配置Action, 编写src/struts.xmlpackage name=package名 extends=struts-defaultaction name=action路径 class=action类 method=action方法名 /action/package 步骤5: 配置视图action .result name=视图名jsp的实际路径 视图名与action方法的返回值对应3. 如何接受请求参数 1) 利用工具类获取request,等对象 HttpServletRequest request = ServletActionContext.getRequest();
2、2) 实现ServletRequestAware来获取request对象 private HttpServletRequest request ; public void setServletRequest(HttpServletRequest request) this.request = request; 3) 利用struts的方法来解决如何获取请求参数 (*) 关键点:将请求参数名与Action属性名相匹配即可,struts会帮助进行类型转换 String, Integer, Double, BigDecimal, Date, 自定义实体类, List, List 例如: +-+ |
3、属性类型和名称 | 请求参数格式 | | Student student(内部有id, name属性) | student.id=1&student.name=zhangsan | | List list| list=值1&list=值2. 或 ?list0=值1&list1=值2. | | String list | list=值1&Student list list0.id=1&list0.name=zhang&list1.id=2&list1.name=lisi | | Map map | map1=北京&map2=上海 | +- -+4. 传值与数据显示 让学生认为struts会将ac
4、tion的属性作为request作用域中的变量进行传递5. 作业 通讯录项目,完成登录功能,做的快的可以完成查询所有联系人功能= Day 2 =1. 值栈 ValueStack ,作用范围:仅局限于一次请求 作用:类似与web中的作用域,用来传值2. 值栈的组成: Root区域 - 栈结构, 后进先出 Context区域 - Map结构,键值对3. Root区域的存取值 Struts 会将Action压入值栈,然后在页面上可以利用 value=top 或不写value 表示取得栈顶对象下标0 - 代表整个栈的list String, Student, Student, Action, Defa
5、ultTextProvider1 - 代表list的子集,从下标1开始 Student, Student, Action, DefaultTextProvider2 代表list的子集,从下标2开始 Student, Action, DefaultTextProvider 2.name 从子集里由上至下查找name属性4. 显示值property / 或 从栈中由上至下查找对象符合的属性,找到第一个匹配后,返回属性值iterator value=list集合属性名!-每次循环开始时,将集合中对象压入栈顶- 利用/s:iteratorif test=条件ifelse/else5. Context
6、区域的存取值, 数据结构是一个大mapkey valuerequest 小mapsession 小mapapplication 小mapattr 小map request - session - application 查找某个属性名parameters 小map key - 请求参数名 , value - String#session6. Request的包装修饰模式 decorator 替换了原有的HttpServletRequest对象的实现为:StrutsRequestWrapper$requestScope.属性根据此属性名先找原始的Request作用域中内容,找不到,再到Value
7、Stack的root区域去找7. 作业 通讯录项目,完成查询所有联系人功能,做的快的完成分页= Day 3 =1. 跳转action . type=dispatcherjsp地址 +-+ | 跳转方式 原理 限制 | | dispatcher forward 只能跳转至jsp | | redirect redirect 可以跳转到jsp, 也可以跳转到 Action | | redirectAction redirect 只能redirect至Action | | chain forward 只能forward至Action |例子:success (*)param name=location
8、目标路径redirect (*)redirectActionactionNameaction名字chain2. 重定向传参: 方法1:使用session, 注意及时清理 方法2:使用重定向时拼接get请求参数请求参数名请求参数值 . 其中请求参数值可以是写死的,也可以是$ognl表达式, 此ognl表达式可以从root或context获取内容+-+| 使用session | 使用拼接get请求参数 | 占用服务器内存多,应及时清理 | 不会占用服务器内存 | 比较简单 | 稍微复杂,对汉字参数需要小心 | 不能跨应用传参 | 可以跨应用,跨服务器 |3. packagepackage . na
9、mespace=/命名空间加了namespace属性后,action的访问地址:namespace值+ action名可以根据项目模块或功能的不同,将action分别放入不同的package进行管理有了命名空间后,不同包下的action要进行跳转,要考虑namespace的取值,如:/n2/a2.actionname$namepass123a2namespace/n2/其他命名空间下,如果查找不到某个action,最后还会到默认命名空间下找一次。特别注意:/n1/a/b/c/d/hello.action将最后一个斜杠之前的内容当成命名空间, 与自己定义的命名空间做 startWith的匹配,
10、选取一个最接近的/n1/n1/a (会匹配)4. action路径的匹配方式每发一次请求都会创建一个新的action实例, 因此struts2 action内的成员变量不会有线程安全问题 (*)同一个action类可以定义多个action方法。简化action配置:可以使用*通配符配合1, 2 . 来简化action配置Dynamic Method Invocation DMI动态方法调用,struts不推荐使用,会带来安全隐患5. 常量值的配置:struts.enable.DynamicMethodInvocation = true|false 表示是否启用DMIstruts.i18n.en
11、coding=字符编码struts.multipart.parser=jakarta 上传文件的实现类 commons-fileuploadstruts.multipart.maxSize=上传文件的大小限制struts.custom.i18n.resources=testmessages,testmessages2=国际化资源文件位置struts.action.extension=action, 用来修改action后缀6. 作业通讯录项目,尝试完成分页功能。完成新增联系人操作= Day 4 =1. 讲解分页练习2. struts中的拦截器亮点, 体现了AOP 面向切面编程的思想 1) 自定
12、义拦截器: public 拦截器类 implements Interceptor public String intercept(ActionInvocation invocation) throws Exception / 调用了invocation.invoke() 表示放行,会调用下一个拦截器或action / 没有调用,则表示操作被拦截 return invocation.invoke();package .interceptors interceptor name=拦截器名拦截器类interceptor-stack name=拦截器栈名 /intercepters拦截器名|拦截器栈名
13、result . 拦截器执行的先后顺序,是根据拦截器栈内定义的先后顺序来执行 2) 系统提供的拦截器有: autowiring - 跟spring整合时使用 chain - action之间使用chain方式进行跳转时的处理 exception - 处理异常的 fileUpload - 处理文件上传 i18n - 处理国际化 params - 处理请求参数的 servletConfig - 用来处理 . Aware接口的注入 token - 产生令牌,解决重复提交 validation - 请求参数的验证处理 workflow - 如果验证出现错误,由此拦截器跳转至input视图 3) 可以为
14、整个包指定一个默认拦截器栈引用,如果action内使用了 标签,则会覆盖默认拦截器栈引用 4) 例子:登录检查拦截器的实现,要点: a) 拦截器如果没放行,那么拦截器的返回值也对应一个视图名 b) 定义视图时,用到一个全局视图定义:global-resultslogin/login.jsp 根据视图名查找视图时,action内的视图优先级高优先查找,找不到,则会查找全局视图中的定义= Day 5 =1. Struts 表单验证 1) 直接在action方法内执行验证 2) action 类要继承ActionSupport父类,重写父类的validate方法 a. 经过params拦截器 执行了
15、参数的类型转换和赋值操作 b. 经过validation拦截器 就会调用validate方法进行验证,将验证出现的错误信息放入父类fieldErrors(map) c. 经过workflow拦截器 检查fieldErrors集合是否为空,如果不为空,转发到名为input的视图 3) 使用xml文件进行声明式验证,action 类要继承ActionSupport父类2. Struts 国际化 1) 准备资源文件 资源文件名_语言代码_国家(地区)代码.properties 2) 在Struts中配置一组资源文件constant name=struts.custom.i18n.resourcesm
16、essage/constant 3) 页面中使用资源文件text name=资源文件中的keytext 4) action中使用资源文件 ActionSupport中的方法: getText() 如果资源文件中需要显示动态内容,也可以利用$ognl表达式来获取值栈中的值 原理: 对于action: 如果请求参数中存在一个名为request_locale的参数,则以它的值优先作为语言国家代码,并存储至Session 否则会以Session中一个变量WW_TRANS_I18N_LOCALE 的值作为语言国家代码 如果以上都没有,根据浏览器请求头中的Accept-Language的值作为语言国家代码
17、 对于jsp: 根据浏览器请求头中的Accept-Language的值作为语言国家代码3. 文件上传 1) 准备表单form action=post enctype=multipart/form-datainput type=file name=参数名 .submit上传/form 2) Action接受文件请求参数 public class 文件上传Action private File 参数名; private String 参数名FileName; / 上传文件的原始名 private String 参数名ContentType; / 上传文件的类型,如:image/jpeg, image/png, text/plain, text/html . public String execute() / 1. 处理文件存储路径 / 2. 处理保存文件名的唯一性(选讲) / 3. 另存文件 / 4. 返回文件在服务器URI路径 3) 上传文件的大小和类型限制 a. 总开关,限制文件的大小struts.multipart.maxSize b. 在每个action限制大小以及类型、扩展名:通过给action配置拦截器实现:fileUpload
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1