Java相关课程系列笔记之十三Struts2学习笔记(建议用WPS打开).pdf
《Java相关课程系列笔记之十三Struts2学习笔记(建议用WPS打开).pdf》由会员分享,可在线阅读,更多相关《Java相关课程系列笔记之十三Struts2学习笔记(建议用WPS打开).pdf(34页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 Struts2 学习笔记 Java 相关课程系列笔记之十三 笔记内容说明 Struts2(李翊老师主讲,占笔记内容 100%);目 录 一、Struts2 概述.1 为什么要用 Struts.1 什么是 MVC.1 JSP Model 1 和 JSP Model 2.1 Struts2 发展史.2 衡量一个框架的标准.2 Struts2 使用步骤.2 内容详解.3 Struts2 提供的方便之处.4 案例:简单登录(使用 Strust2).4 案例:修改、案例使用户不能绕过前端控制器.6 NetCTOSS 项目:显示资费列表.6 NetCTOSS 项目:资费列表分页显示.8 二、OGNL 技
2、术.8 什么是 OGNL.8 OGNL 基本语法.8 OGNL 表达式中加“#”和不加“#”的区别.8 OGNL 体系结构.8 XWord 框架对 OGNL 进行了改造.9 ValueStack 对象结构.9 ValueStack 结构演示.9 Struts2 标签的使用.10 Struts2 对 EL 表达式的支持.10 案例:修改案例(使用 Struts2 标签和 OGNL 表达式).10 三、Action.11 Struts2 的核心组件.11 Struts2 的工作流程.11 在 Action 中访问 Session 和 Application.11 NetCTOSS 项目:用户登录.
3、12 Action 属性注入.13 案例:重构 NetCTOSS 资费列表分页显示(使用属性注入).13 使用通配符配置 Action.13 案例:通配符配置(资费增、改、查).14 Struts2 中 Action 的设计经验.14 四、Result.15 Result 注册配置.15 Result 组件利用元素的 type 属性指定 result 类型.15 常见的 Result 组件类型.15 NetCTOSS 项目:资费删除.15 NetCTOSS 项目:基于 StreamResult 生成验证码.16 NetCTOSS 项目:基于 JSONResult 进行验证码检验.17 NetC
4、TOSS 项目:添加资费模块中的验证资费名是否重复.19 自定义一个 Result.20 五、Struts2 标签.21 A 开头的标签.21 B 开头的标签.21 C 开头的标签.21 D 开头的标签.21 E 开头的标签.21 F 开头的标签.21 G 开头的标签.21 H 开头的标签.21 I 开头的标签.21 L 开头的标签.21 M 开头的标签.21 O 开头的标签.21 P 开头的标签.21 R 开头的标签.21 S 开头的标签.21 T 开头的标签.21 U 开头的标签.21 所有标签都具备的属性.21 案例:常用标签.21 六、拦截器.21 Struts2 详细流程图.21 拦
5、截器的作用.21 拦截器的常用方法.21 自定义拦截器步骤.21 Struts2 内置的拦截器.21 案例:拦截器入门.22 拦截器栈.24 fileUpload 拦截器原理.24 案例:使用 fileUpload 拦截器实现文件上传.24 NetCTOSS 项目:登录检查拦截器.25 七、Struts2 中如何处理异常.25 异常一般出现在何处.25 如何配置异常.25 八、Struts2 中如何实现国际化.25 i18n.25 如何获得中文的 Unicode 编码.25 浏览器如何决定用哪个资源文件.25 资源文件的命名.25 资源文件的分类.25 实现国际化的步骤.25 九、NetCTO
6、SS 项目.27 DAO 优化、重构、封装!【重要】.27 资费更新.27 导航条.27 十、项目经验.29 主键用 int 还是 Integer.29 “./”表示的意思.29 导入静态页面,样式、JS 失效问题.29 和标签.29 四种情形下的绝对路径写法.29 URL 和 URI.29 和.29 一、Struts2 概述 为什么要用 Struts 1)JSP 用 HTML 与 Java 代码混用的方式开发,把表现与业务逻辑代码混合在一起给前期开发与后期维护带来巨大的复杂度。2)解决办法:把业务逻辑代码从表现层中清晰的分离出来。3)2000 年,Craig McClanahan 采用了 M
7、VC 的设计模式开发 Struts 主流的开发技术,大多数公司在使用。什么是 MVC 1)M-Model 模型 模型(Model)的职责是负责业务逻辑。包含两部分:业务数据和业务处理逻辑。比如实体类、DAO、Service 都属于模型层。2)V-View 视图 视图(View)的职责是显示界面和用户交互(收集用户信息)。属于视图的类是不包含业务逻辑和控制逻辑的 JSP。3)C-Controller 控制器 控制器是模型层 M 和视图层 V 之间的桥梁,用于控制流程。比如我们之前项目中写的 ActionServlet。JSP Model 1 和 JSP Model 2 1)JSP Model 1
8、 最早的 JSP/Servlet 模式被我们称之为 JSP Model 1(JSP 设计模式 1),在其中有模型层 M,但是视图层 V 的 JSP 中包含了业务逻辑或控制逻辑,JSP 和 Servlet 紧密耦合。即:JSP(数据的展现和业务流程的控制)+JavaBean(对数据的访问和运算,Model)。2)JSP Model 2 JSP Model 2(JSP 设计模式 2)和 JSP Model1 不同之处再与将 JSP 中的业务逻辑和控制逻辑全部剔除,并全部放入控制层 C 中,JSP 仅仅具有显示页面和用户交互的功能。编程理念:高内聚低耦合。即:M:Model,用 JavaBean 来
9、做(对数据的访问和运算)V:View,用 JSP 来作(数据的展现)C:Controller,用 Servlet 来作(业务流程的控制)Struts2 发展史 1)最早出现的 Struts1 是一个非常著名的框架,它实现了 MVC 模式。Struts1 简单小巧,其中最成熟的版本是。2)之后出现了 WebWork 框架,其实现技术比 Struts1 先进,但影响力不如 Struts1。3)在框架技术不断发展的过程中,有人在 WebWork 的核心 XWork 的基础上包装了 Struts1(算是两种框架的整合),由此,结合了 Struts1 的影响力和 WebWork 的先进技术,Struts
10、2诞生了。4)Struts2 不是 Struts1 的升级,它更像是 WebWork 的升级版本。衡量一个框架的标准 1)健壮性:不健壮(带 0 的就是实验品),是健壮的(也不健壮,该版本 BUG 较多),3颗星。2)易用性:易用性越好,原理则越复杂,4 颗星。3)扩展性:Struts2,5 颗星。4)侵入性:即对写代码的要求(如:必须继承某个类才能怎么怎么样),越低越好。Struts2 低但也有侵入性,4 颗星。Struts2 使用步骤 step1:创建一个 JavaWeb Project,命名为 struts01(Struts2 只能用在 Web 项目里)step2:拷贝 Struts2
11、的核心 Jar 包到 WEB-INF/lib/下,基本功能核心 jar 包 5 个:1):Struts2 核心包,是 WebWork 内核。2):Struts2 核心包,是 Struts 框架的“外衣”。3):用来支持 OGNL 表达式的,类似于 EL 表达式,功能比 EL 表达式强大的多。4):freemarker 是比 JSP 更简单好用,功能更加强大的表现层技术,用来替代 JSP 的。在 Struts2 中提倡使用 freemarker 模板,但实际项目中使用 JSP 也很多。5):用于实现文件上传功能的 jar 包。step3:在中配置 Struts2 的前端控制器,Struts2 是
12、用 Filter(过滤器)实现的前端控制器,它只负责根据请求调用不同的 Action 注意事项:原来的项目是用 Servlet 的方式作为控制器。内容:Struts2 Struts2 /*step4:在 WebRoot 下新建 jsp 文件夹,并在其中创建和 1)$error 2)Welcome,$name step5:在包下创建 WelcomeAction 类 private String name;private String error;各自的 get/set 方法 public String execute()().);if(name=null|.equals(name)error=用
13、户名不能为空;return fail;name:+name);qualsIgnoreCase(name)error=不能使用名字 text登录;return fail;else return success;step6:写 Struts2 所需要的控制器配置文件,非常重要!该文件写请求与各个 Action(Java类)的对应关系,前端控制器会根据配置信息调用对应的 Action(Java 类)去处理请求 注意事项:在编写时放在 src 目录中,而部署后该文件位于 WEB-INF/classes/下!同样的,.properties 文件也放 src 下,部署后也在 WEB-INF/classes
14、/下!程序一启动,就会被加载到内存,并不是现读的。内容如下:!DOCTYPE struts PUBLIC-td 格式要求,如:不在第一行可能会报错,标签中随意换行也会引起 404!step7:部署,地址栏输入:,发现一进入页面,则错误提示信息已经显示!为了解决该问题,需要再定义一个用于读取页面,而不是发请求后立即执行 WelcomeAction 类进行处理,处理应当在点击提交后才执行。step8:在中添加新的仅仅用于读取页面 /jsp/step9:重新部署,地址栏输入:,发现问题已经解决,可正常执行 内容详解 1):作用是为分组,标签下可有多个,而标签有如下属性:name=helloworld
15、:唯一的标识,表示包名为 helloworld。注意事项:在相同包里的不能重复,不同包的可以重复!namespace=/day01:用来设置该包中的 action 的地址的命名空间。注意事项:命名空间中的“/”要写!也可以这么写:namespace=/,表示根命名空间,此时 Action 的访问路径为:即:/day01,此时 Action 的访问路径为:即:extends=struts-default:继承的包名,一般继承 Struts2 默认提供的 struts-default包,该包中定义了很多 Struts2 应用必须的组件(比如:拦截器);该 package 声明的位置在文件中。注意事
16、项:appName 是部署时项目的名字!包只能继承包。不能说包继承某个类!2):作用是指明每个请求对应的 Action 类之间的对应关系(一个对应一个请求),下可有多个。而标签有如下属性:name=welcome:表示请求的名字为 welcome(即)class=:格式为“包名.类名”。指定了对应的 Action 类(Java 类)来处理请求。class 属性可以不写,不写则 Struts2 会默认为该添加一个 class(自动创建一个类,该类中的 execute()方法只有一个 return success;语句),作用是转发到对应的中指定的页面。method=xxx:用于指定在对应的 Ac
17、tion 类中要执行的方法名,该方法的返回值必须是 String 类型(这是规定!)例如:public String xxx().return string;.return string。3):作用是指明执行相应的 Action 类之后,显示哪种结果页。而标签有如下属性:name=success:是该 result 的名称,Action 返回哪一个 result 的 name 值,意味着要转发到哪一个 result 所对应的 JSP 地址,不写 name 属性,则默认为success。type=:默认 dispatcher(转发),还可写 json、stream、等 10 种 Struts2
18、提供的方便之处 1)数据的自动封装(输入属性)根据页面组件的 name 属性,自动封装到 Action 中对应的 name 属性中,即自动调用某属性的 set 方法。例如:在 JSP 页面,而在 Action 中则会自动给属性 private String name 赋值。注意事项:必须有 name 属性对应的 get 和 set 方法。2)数据的自动传递(输出属性)Action 中的属性在 JSP 页面可以直接用 EL 表达式拿到,即自动调用某属性的 get方法。例如:Action 中的属性 private String name;在 JSP 页面上可以直接$name得到对应的值。案例:简单
19、登录(使用 Strust2)step1:新建 Web 工程 struts01,导入 Struts2 的五个基本核心包,并在中配置 Struts2 的前端控制器,代码,见中 step3 step2:在 WebRoot 下创建 jsp 文件夹,并放入和 1)用 户 名:密码:$errorMsg 注意事项:应用名前的“/”要写。标签中的 action 属性只写 action=也可!如果写成 action=day01/,则会出现叠加问题!可参考 Spring 笔记节。2)Welcome,$name step3:在包下新建 LoginAction 类 private String name;privat
20、e String pwd;private String errorMsg;各自的 get/set 方法 public String execute()if(chang.equals(name)&123.equals(pwd)名-/jsp/jsp/step5:部署,地址栏输入:,发现一进入页面,则错误提示信息已经显示!为了解决该问题,需要再定义一个用于读取页面,而不是发请求后立即执行 LoginAction 类进行处理,处理应当在点击登录后才执行。step6:在中添加新的仅仅用于读取页面 /jsp/注意事项:当前配置指明了 class,则需要自己再写一个 LoginFormAction 类 st
21、ep7:在包下新建 LoginFormAction 类 public class LoginFormAction public String execute()return success;step8:重新部署,地址栏输入:,发现问题已经解决,可正常执行 step9:优化:step6 也可这么写,此时也不用写 step8 中的 LoginFormAction 类了 /jsp/案例:修改、案例使用户不能绕过前端控制器 1)问题描述:和案例都存在一个问题,用户可以绕过前端控制器,直接访问 JSP 页面,如地址栏直接输入:,可显示页面,只是获取的名字为空。2)如何解决:step1:将 jsp 文件夹
22、放入 WEB-INF 目录下。因为 WEB-INF 目录中的内容是受保护的,不能直接访问!但能转发过来。step2:修改案例中 result 的转发路径,也同理 /WEB-INF/jsp/WEB-INF/jsp/WEB-INF/jsp/step3:测试,访问登录页面 NetCTOSS 项目:显示资费列表 step1:新建 Web 工程:NetCTOSS,导入需要的包:Struts2 核心包、Oracle 数据库驱动包、JSTL 包(若为则不需要导这个包了,若为则需要导入!)step2:创建 COST_CHANG 表,并插入数据,别忘记 commit create table cost_chan
23、g(id number(4)constraint cost_chang_id_pk primary key,name varchar2(50)not null,base_duration number(11),base_cost number(7,2),unit_cost number(7,4),status char(1)constraint cost_chang_status_ck check(status in(0,1),descr varchar2(100),creatime date default sysdate,startime date,cost_type char(1);in
24、sert into cost_chang values(1,元套餐,20,0,元 20 小时/月,超出部分元/时,default,null,2);insert into cost_chang values(2,元套餐,40,0,元 40 小时/月,超出部分元/时,default,null,2);insert into cost_chang values(3,元套餐,100,0,元 100 小时/月,超出部分元/时,default,null,2);insert into cost_chang values(4,元套餐,200,0,元 200 小时/月,超出部分元/时,default,null,2
25、);insert into cost_chang values(5,计时收费,null,null,0,元/时,不使用不收费,default,null,3);insert into cost_chang values(6,包月,null,20,null,0,每月 20 元,不限制使用时间,default,null,1);注意事项:在 Oracle 数据库中,语句大小写都可,但最终在数据库中显示的是大写形式。step3:新建到 src 目录下,将 username 和 password 修改为自己的数据库的用户名和密码 user=system password=chang url=jdbc:ora
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 相关 课程 系列 笔记 十三 Struts2 学习 建议 WPS 打开
限制150内