Struts2学习笔记
Java相关课程系列笔记之十三
笔记内容说明
Struts2(李翊老师主讲,占笔记内容100%);
目录
一、Struts2概述 (1)
1.1为什么要用Struts (1)
1.2什么是MVC (1)
1.3 JSP Model 1和JSP Model 2 (1)
1.4 Struts2发展史 (2)
1.5衡量一个框架的标准 (2)
1.6 Struts2使用步骤 (2)
1.7 struts.xml内容详解 (4)
1.8 Struts2提供的方便之处 (5)
1.9案例:简单登录(使用Strust2) (5)
1.10案例:修改1.6、1.9案例使用户不能绕过前端控制器 (6)
1.11 NetCTOSS项目:显示资费列表 (7)
1.12 NetCTOSS项目:资费列表分页显示 (11)
二、OGNL技术 (14)
2.1什么是OGNL (14)
2.2 OGNL基本语法 (14)
2.3 OGNL表达式中加“#”和不加“#”的区别 (15)
2.4 OGNL体系结构 (16)
2.5 XWord框架对OGNL进行了改造 (16)
2.6 ValueStack对象结构 (16)
2.7 ValueStack结构演示 (17)
2.8 Struts2标签的使用 (18)
2.9 Struts2对EL表达式的支持 (18)
2.10案例:修改1.12案例(使用Struts2标签和OGNL表达式) (18)
三、Action (19)
3.1 Struts2的核心组件 (19)
3.2 Struts2的工作流程 (19)
3.3在Action中访问Session和Application (19)
3.4 NetCTOSS项目:用户登录 (20)
3.5 Action属性注入 (23)
3.6案例:重构NetCTOSS资费列表分页显示(使用属性注入) (23)
3.7使用通配符配置Action (23)
3.8案例:通配符配置(资费增、改、查) (24)
3.9 Struts2中Action的设计经验 (24)
四、Result (25)
4.1 Result注册配置 (25)
4.2 Result组件利用
4.3常见的Result组件类型 (25)
4.4 NetCTOSS项目:资费删除 (25)
4.5 NetCTOSS项目:基于StreamResult生成验证码 (27)
4.6 NetCTOSS项目:基于JSONResult进行验证码检验 (29)
4.7 NetCTOSS项目:添加资费模块中的验证资费名是否重复 (31)
1
五、Struts2标签 (35)
5.1 A开头的标签 (35)
5.2 B开头的标签 (35)
5.3 C开头的标签 (35)
5.4 D开头的标签 (35)
5.5 E开头的标签 (35)
5.6 F开头的标签 (35)
5.7 G开头的标签 (36)
5.8 H开头的标签 (36)
5.9 I开头的标签 (36)
5.10 L开头的标签 (36)
5.11 M开头的标签 (36)
5.12 O开头的标签 (36)
5.13 P开头的标签 (36)
5.14 R开头的标签 (36)
5.15 S开头的标签 (36)
5.16 T开头的标签 (37)
5.17 U开头的标签 (37)
5.18所有标签都具备的属性 (37)
5.19案例:常用标签 (37)
六、拦截器 (40)
6.1 Struts2详细流程图 (40)
6.2拦截器的作用 (40)
6.3拦截器的常用方法 (40)
6.4自定义拦截器步骤 (40)
6.5 Struts2内置的拦截器 (41)
6.6案例:拦截器入门 (42)
6.7拦截器栈 (45)
6.8 fileUpload拦截器原理 (45)
6.9案例:使用fileUpload拦截器实现文件上传 (45)
6.10 NetCTOSS项目:登录检查拦截器 (47)
七、Struts2中如何处理异常 (49)
7.1异常一般出现在何处 (49)
7.2如何配置异常 (49)
八、Struts2中如何实现国际化 (50)
8.1 i18n (50)
8.2如何获得中文的Unicode编码 (50)
8.3浏览器如何决定用哪个资源文件 (50)
8.4资源文件的命名 (50)
8.5资源文件的分类 (50)
8.6实现国际化的步骤 (50)
九、NetCTOSS项目 (52)
9.1 DAO优化、重构、封装!【重要】 (52)
2
9.3导航条 (56)
十、项目经验 (58)
10.1主键用int还是Integer (58)
10.2 “../”表示的意思 (58)
10.3导入静态页面,样式、JS失效问题 (58)
10.4
10.5四种情形下的绝对路径写法 (58)
10.6 URL和URI (58)
10.7 util.Date和sql.Date (58)
3
一、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.3 JSP Model 1和JSP Model 2
1)JSP Model 1
最早的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来做(对数据的访问和运算)
V:View,用JSP来作(数据的展现)
C:Controller,用Servlet来作(业务流程的控制)
1
1.4 Struts2发展史
1)最早出现的Struts1是一个非常著名的框架,它实现了MVC模式。Struts1简单小巧,其中最成熟的版本是Struts1.2。
2)之后出现了WebWork框架,其实现技术比Struts1先进,但影响力不如Struts1。
3)在框架技术不断发展的过程中,有人在WebWork的核心XWork的基础上包装了Struts1(算是两种框架的整合),由此,结合了Struts1的影响力和WebWork的先进技术,Struts2诞生了。
4)Struts2不是Struts1的升级,它更像是WebWork的升级版本。
1.5衡量一个框架的标准
1)健壮性:Struts2.0不健壮(带0的就是实验品),Struts2.1.8是健壮的(2.1.6也不健壮,该版本BUG较多),3颗星。
2)易用性:易用性越好,原理则越复杂,4颗星。
3)扩展性:Struts2,5颗星。
4)侵入性:即对写代码的要求(如:必须继承某个类才能怎么怎么样……),越低越好。Struts2低但也有侵入性,4颗星。
1.6 Struts2使用步骤
step1:创建一个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包。
step3:在web.xml中配置Struts2的前端控制器,Struts2是用Filter(过滤器)实现的前端控制器,它只负责根据请求调用不同的Action
注意事项:原来的项目是用Servlet的方式作为控制器。
web.xml内容:
xmlns:xsi="https://www.doczj.com/doc/9114972852.html,/2001/XMLSchema-instance" xsi:schemaLocation="https://www.doczj.com/doc/9114972852.html,/xml/ns/j2ee https://www.doczj.com/doc/9114972852.html,/xml/ns/j2ee/web-app_2_4.xsd"> org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter 2
step4:在WebRoot下新建jsp文件夹,并在其中创建nameform.jsp和welcome.jsp 1)nameform.jsp
2)Welcome.jsp
step5:在com.tarena.action包下创建WelcomeAction类
private String name; private String error; ……各自的get/set方法
public String execute() { System.out.println("WelcomeAction.execute()...");
if(name==null||"".equals(name)){ error="用户名不能为空"; return "fail"; }
System.out.println("name: " + name);//用于测试
if ("test".equalsIgnoreCase(name)) { error="不能使用名字text登录";
return "fail";
}else{ return "success"; } } step6:写Struts2所需要的控制器配置文件struts.xml,非常重要!该文件写请求与各个Action (Java类)的对应关系,前端控制器会根据配置信息调用对应的Action(Java类)去处理请求
◆注意事项:
在编写时struts.xml放在src目录中,而部署后该文件位于WEB-INF/classes/下!
同样的,.properties文件也放src下,部署后也在WEB-INF/classes/下!
程序一启动,struts.xml就会被加载到内存,并不是现读的。
struts.xml内容如下:
◆注意事项:xml文件内容严格按照.dtd格式要求,如:不在第一行可能会
报错,标签中随意换行也会引起404!
step7:部署,地址栏输入:http://localhost:8080/struts01/day01/welcome.action进行测试,发现3
一进入页面,则错误提示信息已经显示!为了解决该问题,需要再定义一个
step9:重新部署,地址栏输入:http://localhost:8080/struts01/day01/welcomeform.action进行测试,发现问题已经解决,可正常执行
1.7 struts.xml内容详解
1)
①name="helloworld":唯一的标识,表示包名为helloworld。
◆注意事项:在相同包里的不能重复,不同包的可以重复!
②namespace="/day01":用来设置该包中的action的地址的命名空间。
◆注意事项:
命名空间中的“/”要写!
也可以这么写:namespace="/",表示根命名空间,此时Action的访问
路径为:http://localhost:8080/appName/actionName.action
即:http://localhost:8080/struts01/welcome.action
一般写法为:namespace="/day01",此时Action的访问路径为:
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)
①name="welcome":表示请求的名字为welcome(即welcome.action)
②class="com.tarena.action.WelcomeAction":格式为“包名.类名”。指定了对应的Action类(Java类)来处理请求。class属性可以不写,不写则Struts2会默认为该
③method="xxx":用于指定在对应的Action类中要执行的方法名,该方法的返回值必须是String类型(这是规定!!)
例如:public String xxx(){...return string;}//返回的string是
若没有method属性或method="",则默认调用方法名为execute的方法,即:public String execute(){...return string}。
3)
4
①name="success":是该result的名称,Action返回哪一个result的name值,意味着要转发到哪一个result 所对应的JSP地址,
②type="":默认dispatcher(转发),还可写json、stream、 (10)
1.8 Struts2提供的方便之处
1)数据的自动封装(输入属性)
根据页面组件的name属性,自动封装到Action中对应的name属性中,即自动调用某属性的set方法。
例如:在JSP页面,而在Action中则会自动给属性private String name赋值。
◆注意事项:必须有name属性对应的get和set方法。
2)数据的自动传递(输出属性)
Action中的属性在JSP页面可以直接用EL表达式拿到,即自动调用某属性的get 方法。
例如:Action中的属性private String name;在JSP页面上可以直接${name}得到对应的值。
1.9案例:简单登录(使用Strust2)
step1:新建Web工程struts01,导入Struts2的五个基本核心包,并在web.xml中配置Struts2的前端控制器,web.xml代码,见1.6中step3
step2:在WebRoot下创建jsp文件夹,并放入loginform.jsp和welcome.jsp 1)loginform.jsp
◆注意事项:
应用名前的“/”要写。