当前位置:文档之家› JAVA相关课程系列笔记之13STRUTS2学习笔记(建议用WPS打开)

JAVA相关课程系列笔记之13STRUTS2学习笔记(建议用WPS打开)

Struts2学习笔记

Java相关课程系列笔记之十三

笔记内容说明

Struts2(李翊老师主讲,占笔记内容100%);

目录

一、Struts2概述 (1)

1.1为什么要用Struts (1)

1.2什么是MVC (1)

1.3JSP Model1和JSP Model2 (1)

1.4Struts2发展史 (2)

1.5衡量一个框架的标准 (2)

1.6Struts2使用步骤 (2)

1.7struts.xml内容详解 (4)

1.8Struts2提供的方便之处 (5)

1.9案例:简单登录(使用Strust2) (5)

1.10案例:修改1.6、1.9案例使用户不能绕过前端控制器 (6)

1.11NetCTOSS项目:显示资费列表 (7)

1.12NetCTOSS项目:资费列表分页显示 (11)

二、OGNL技术 (14)

2.1什么是OGNL (14)

2.2OGNL基本语法 (14)

2.3OGNL表达式中加“#”和不加“#”的区别 (15)

2.4OGNL体系结构 (16)

2.5XWord框架对OGNL进行了改造 (16)

2.6ValueStack对象结构 (16)

2.7ValueStack结构演示 (17)

2.8Struts2标签的使用 (18)

2.9Struts2对EL表达式的支持 (18)

2.10案例:修改1.12案例(使用Struts2标签和OGNL表达式) (19)

三、Action (20)

3.1Struts2的核心组件 (20)

3.2Struts2的工作流程 (20)

3.3在Action中访问Session和Application (20)

3.4NetCTOSS项目:用户登录 (21)

3.5Action属性注入 (24)

3.6案例:重构NetCTOSS资费列表分页显示(使用属性注入) (24)

3.7使用通配符配置Action (24)

3.8案例:通配符配置(资费增、改、查) (25)

3.9Struts2中Action的设计经验 (25)

四、Result (26)

4.1Result注册配置 (26)

4.2Result组件利用元素的type属性指定result类型 (26)

4.3常见的Result组件类型 (26)

4.4NetCTOSS项目:资费删除 (26)

4.5NetCTOSS项目:基于StreamResult生成验证码 (28)

4.6NetCTOSS项目:基于JSONResult进行验证码检验 (30)

4.7NetCTOSS项目:添加资费模块中的验证资费名是否重复 (32)

五、Struts2标签 (36)

5.1A开头的标签 (36)

5.2B开头的标签 (36)

5.3C开头的标签 (36)

5.4D开头的标签 (36)

5.5E开头的标签 (36)

5.6F开头的标签 (36)

5.7G开头的标签 (37)

5.8H开头的标签 (37)

5.9I开头的标签 (37)

5.10L开头的标签 (37)

5.11M开头的标签 (37)

5.12O开头的标签 (37)

5.13P开头的标签 (37)

5.14R开头的标签 (37)

5.15S开头的标签 (37)

5.16T开头的标签 (38)

5.17U开头的标签 (38)

5.18所有标签都具备的属性 (38)

5.19案例:常用标签 (38)

六、拦截器 (41)

6.1Struts2详细流程图 (41)

6.2拦截器的作用 (41)

6.3拦截器的常用方法 (41)

6.4自定义拦截器步骤 (41)

6.5Struts2内置的拦截器 (42)

6.6案例:拦截器入门 (43)

6.7拦截器栈 (46)

6.8fileUpload拦截器原理 (46)

6.9案例:使用fileUpload拦截器实现文件上传 (46)

6.10NetCTOSS项目:登录检查拦截器 (48)

七、Struts2中如何处理异常 (50)

7.1异常一般出现在何处 (50)

7.2如何配置异常 (50)

八、Struts2中如何实现国际化 (51)

8.1i18n (51)

8.2如何获得中文的Unicode编码 (51)

8.3浏览器如何决定用哪个资源文件 (51)

8.4资源文件的命名 (51)

8.5资源文件的分类 (51)

8.6实现国际化的步骤 (51)

九、NetCTOSS项目 (53)

9.1DAO优化、重构、封装!【重要】 (53)

9.3导航条 (57)

十、项目经验 (59)

10.1主键用int还是Integer (59)

10.2“../”表示的意思 (59)

10.3导入静态页面,样式、JS失效问题 (59)

10.4标签 (59)

10.5四种情形下的绝对路径写法 (59)

10.6URL和URI (59)

10.7util.Date和sql.Date (59)

一、Struts2概述

1.1为什么要用Struts

1)JSP用HTML与Java代码混用的方式开发,把表现与业务逻辑代码混合在一起给前期开发与后期维护带来巨大的复杂度。

2)解决办法:把业务逻辑代码从表现层中清晰的分离出来。

3)2000年,Craig McClanahan采用了MVC的设计模式开发Struts主流的开发技术,大多数公司在使用。

1.2什么是MVC

1)M-Model模型

模型(Model)的职责是负责业务逻辑。包含两部分:业务数据和业务处理逻辑。比如实体类、DAO、Service都属于模型层。

2)V-View视图

视图(View)的职责是显示界面和用户交互(收集用户信息)。属于视图的类是不包含业务逻辑和控制逻辑的JSP。

3)C-Controller控制器

控制器是模型层M和视图层V之间的桥梁,用于控制流程。比如我们之前项目中写的ActionServlet。

1.3JSP Model1和JSP Model2

1)JSP Model1

最早的JSP/Servlet模式被我们称之为JSP Model1(JSP设计模式1),在其中有模型层M,但是视图层V的JSP中包含了业务逻辑或控制逻辑,JSP和Servlet紧密耦合。即:JSP (数据的展现和业务流程的控制)+JavaBean(对数据的访问和运算,Model)。

2)JSP Model2

JSP Model2(JSP设计模式2)和JSP Model1不同之处再与将JSP中的业务逻辑和控制逻辑全部剔除,并全部放入控制层C中,JSP仅仅具有显示页面和用户交互的功能。

编程理念:高内聚低耦合。即:

M:Model,用JavaBean来做(对数据的访问和运算)

V:View,用JSP来作(数据的展现)

C:Controller,用Servlet来作(业务流程的控制)

Struts2发展史

1)最早出现的Struts1是一个非常著名的框架,它实现了MVC模式。Struts1简单小巧,其中最成熟的版本是Struts1.2。

2)之后出现了WebWork框架,其实现技术比Struts1先进,但影响力不如Struts1。

3)在框架技术不断发展的过程中,有人在WebWork的核心XWork的基础上包装了Struts1(算是两种框架的整合),由此,结合了Struts1的影响力和WebWork的先进技术,Struts2

生了。

4)Struts2不是Struts1的升级,它更像是WebWork的升级版本。

衡量一个框架的标准

1)健壮性:Struts2.0不健壮(带0的就是实验品),Struts2.1.8是健壮的(2.1.6也不健壮,该版本BUG较多),3颗星。

2)易用性:易用性越好,原理则越复杂,4颗星。

3)扩展性:Struts2,5颗星。

4)侵入性:即对写代码的要求(如:必须继承某个类才能怎么怎么样……),越低越好。Struts2低但也有侵入性,4颗星。

Struts2使用步骤

:创建一个JavaWeb Project,命名为struts01(Struts2只能用在Web项目里)

step2:拷贝Struts2的核心Jar包到WEB-INF/lib/下,基本功能核心jar包5个:1)xwork-core-2.1.6.jar:Struts2核心包,是WebWork内核。

2)struts-core-2.1.8.jar:Struts2核心包,是Struts框架的“外衣”。

3)ognl-2.7.3.jar:用来支持OGNL表达式的,类似于EL表达式,功能比EL表达式强大的多。

4)freemarker-2.3.15.jar:freemarker是比JSP更简单好用,功能更加强大的表现层技术,用来替代JSP的。在Struts2中提倡使用freemarker模板,但实际项目中使用JSP也很多。

5)commons-fileupload.jar:用于实现文件上传功能的jar包。

制器,它只负责根据请求调用不同的Action

注意事项:原来的项目是用Servlet的方式作为控制器。

web.xml内容:

(Java类)的对应关系,前端控制器会根据配置信息调用对应的Action(Java类)去处理请求

◆注意事项:

在编写时struts.xml放在src目录中,而部署后该文件位于WEB-INF/classes/下!

同样的,.properties文件也放src下,部署后也在WEB-INF/classes/下!

程序一启动,struts.xml就会被加载到内存,并不是现读的。

http://localhost:8080/appName/namespace/actionName.action

即:http://localhost:8080/struts01/day01/welcome.action

③extends="struts-default":继承的包名,一般继承Struts2默认提供的struts-default 包,该包中定义了很多Struts2应用必须的组件(比如:拦截器);该package声明的位置在struts2-core-2.1.8.jar/struts-default.xml文件中。

◆注意事项:

appName是部署时项目的名字!

包只能继承包。不能说包继承某个类!

2):作用是指明每个请求对应的Action类之间的对应关系(一个对应

一个请求),下可有多个。而标签有如下属性:

①name="welcome":表示请求的名字为welcome(即welcome.action)

②class="com.tarena.action.WelcomeAction":格式为“包名.类名”。指定了对应的Action类(Java类)来处理请求。class属性可以不写,不写则Struts2会默认为该添加一个class(自动创建一个类,该类中的execute()方法只有一个return"success";语句),作用是转发到对应的中指定的页面。

③method="xxx":用于指定在对应的Action类中要执行的方法名,该方法的返回值

step2:在WebRoot下创建jsp文件夹,并放入loginform.jsp和welcome.jsp

应用名前的“/”要写。

标签中的action属性只写action="login.action"也可!如果写成action="day01/login.action",则会出现叠加问题!可参考Spring笔记12.2节。

1.10案例:修改1.6、1.9案例使用户不能绕过前端控制器

1)问题描述:1.6和1.9案例都存在一个问题,用户可以绕过前端控制器,直接访问JSP 页面,如地址栏直接输入:http://localhost:8080/struts01/jsp/welcome.jsp,可显示页面,只是获取的名字为空。

2)如何解决:

step1:将jsp文件夹放入WEB-INF目录下。因为WEB-INF目录中的内容是受保护的,不能直接访问!但能转发过来。

形式。

step3:新建db.properties到src目录下,将username和password修改为自己的数据库的用户名和密码

方法测试,此处先用main方法测

”后缀改为动态页面“.jsp”后缀

)首先在页面顶部添加页面指令:<%@page pageEncoding="utf-8"%>

◆注意事项:

当学习了Struts2的标签和OGNL表达式后,上面的JSTL标签和EL表达式可都被替换掉。

JSP页面记得引入:<%@taglib prefix="c"uri="https://www.doczj.com/doc/b95277104.html,/jsp/jstl/core"%> step16:【项目经验】在src目录下分别创建struts.xml和struts-cost.xml配置文件1)struts.xml,相当于主配置,分别引入其他配置文件。为何要用这种形式?因为当配置文件太大时,采用该方式便于管理

step17:部署,测试,地址栏输入:http://localhost:8080/NetCTOSS/cost/list.action,效果如下:

◆注意事项:为了看效果,此处在数据库中修改了几个资费状态值和开通时间。

1.12NetCTOSS项目:资费列表分页显示

step1:此例是在1.11案例基础之上做修改。也可以复制1.11案例的工程再修改,如果采取复制,则步骤如下:

1)点击NetCTOSS工程,右键点击“Copy”,然后右键点击“Paste”,起个工程名,如:

NetCTOSS2

2)但是这样复制的工程,在MyEclipse中工程名虽然为NetCTOSS2,但是当要部署到Tomcat下时,发现无法部署,因为已经有同名的应用被部署了!所以,此时需要修改工程名为NetCTOSS2的工程,在部署时的应用名!

3)修改部署时的应用名:右键工程-->选择“Properties”-->选择“MyEclipse”-->选择“Web”-->在Web Context-root文本框中,为当前工程部署时的应用名,将它修改为“/NetCTOSS2”,点击“OK”即可,记得要写“/”。此时,工程名和应用名一致。

注意事项:要注意区分工程名和应用名的问题!

二、OGNL技术

2.1什么是OGNL

OGNL是Object-Graph Navigation Language(对象图形导航语言)的缩写,它是一种功能强大的表达式语言。

OGNL可以让我们用非常简单的表达式访问对象层,它用一个独立的lib形式出现(封装于ognl.jar中),方便我们使用或构建自己的框架。

注意事项:OGNL中只能创建List和Map对象。

10)案例1:step1:新建工程,导入Struts2核心包,配置前端控制器

2.3OGNL表达式中加“#”和不加“#”的区别step1:在2.2节的工程中,新建Bar类,添加name属性,并设置get/set方法

相关主题
文本预览
相关文档 最新文档