java EE开发之Struts2第一章

1. 什么是框架?为什么要学框架 ?
框架 是 实现部分功能的代码 (半成品),使用框架简化企业级软件开发
学习框架 ,清楚的知道框架能做什么? 还有哪些工作需要自己编码实现 ?
例如:制作简历
给你一张白纸———–格式和内容什么都要自己写(以前web应用 无框架)
网上下个简历模板—-只需要写内容就行了(打印的简历模板—-框架)
好处:效率更高

2. 什么是Struts2 ?
Struts2 是一款优秀MVC框架

MVC:是一种思想,是一种模式,将软件分为 Model模型、View视图、Controller控制器
* MVC由来是web开发 JavaEE软件三层结构 : web层(表现层)、业务逻辑层、数据持久层 (sun提供JavaEE开发规范)JavaEE开发更强调三层结构, web层开发注重MVC

struts2 就是 web层开发框架,符合MVC模式 。
* struts1 、webwork 、jsf 、SpringMVC 都是MVC 框架。

3. Struts2 和 Struts1 关系
没有关系, Struts2 全新框架,引入WebWork很多技术和思想,Struts2 保留Struts1 类似开发流程 , Struts2 内核 webwork ;Xwork提供了很多核心功能:前端拦截器
(interceptor),运行时表单属性验证,类型转换,强大的表达式语言(OGNL – the Object Graph Navigation Language),IoC(Inversion of Control反转控制)容器等。

Struts2快速入门
1)下载开发包
课程以 struts2 3.15.1 讲解

2)目录结构
apps : struts2官方demo
docs : 文档
lib : jar包
src : 源码

3)导入jar包到开发工程
只需要导入 apps/struts2-blank.war 中所有jar包 —- 13 个jar包
4) 编写页面
hello.jsp 请求页面

<a href="${pageContext.request.contextPath }/hello.action">访问struts2入门</a>

success.jsp 结果页面
5)在web.xml 配置struts2 前端控制器 (Filter)

<filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-cla
ss>
  </filter>
  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

6)执行struts2过滤器后,读取配置文件,将请求分发
在src下创建struts.xml

 <package name="default" namespace="/" extends="struts-default">
        <!-- <a href="${pageContext.request.contextPath }/hello.action">访问struts2入门</a>        -->
        <!-- 将请求 分发给一个Action -->
        <!-- action的name 就是hello.action 去掉扩展名  -->
        <action name="hello" class="com.kz.struts2.demo1.HelloAction"></action>
    </package>

7)执行目标Action中execute方法

8)跳转到结果页面
在Action的execute方法中返回 字符串,在struts.xml中配置字符串与页面对应关系
<result name="executesuccess">/demo1/success.jsp</result> 完成结果页面跳转
4 . Struts2流程分析与工具配置
1)执行流程
请求 —- StrutsPrepareAndExecuteFilter 核心控制器 —– Interceptors 拦截器(实现代码功能 ) —– Action 的execuute — 结果页面 Result
* 拦截器 在 struts-default.xml定义
* 执行拦截器 是 defaultStack 中引用拦截器

—- 通过源代码级别断点调试,证明拦截器是执行

这里写图片描述
2)配置struts.xml 提示问题
如果安装Aptana编辑器 ,请不要用Aptana自带xml编辑器 编写struts2配置文件
struts.xml提示来自于 DTD约束,
“-//Apache Software Foundation//DTD Struts Configuration 2.3//EN”
“http://struts.apache.org/dtds/struts-2.3.dtd”>
如果可以上网,自动缓存dtd,提供提示功能
如果不能上网,也可以配置本地DTD提示

* 导入DTD时,应该和配置DTD版本一致

3)关联struts2源码
关联 zip包

4)Config Brower 插件使用
提供在浏览器中查看 struts2 配置加载情况

将解压struts2/lib/struts2-config-browser-plugin-2.3.7.jar 复制WEB-INF/lib下

访问 http://localhost:8080/kzStruts2_2/config-browser/index.action 查看 struts2配置加载情况

5. Struts2配置

【1,Struts2配置文件加载顺序】
struts2 配置文件 由核心控制器加载
StrutsPrepareAndExecuteFilter (预处理,执行过滤)
init_DefaultProperties(); // [1] ———- org/apache/struts2/default.properties
init_TraditionalXmlConfigurations();// [2] — struts-default.xml,struts-plugin.xml,struts.xml
init_LegacyStrutsProperties(); // [3] — 自定义struts.properties
init_CustomConfigurationProviders(); // [5] —– 自定义配置提供
init_FilterInitParameters() ; // [6] —– web.xml
init_AliasStandardObjects() ; // [7] —- Bean加载

结论 :
default.properties 该文件保存在 struts2-core-2.3.7.jar 中 org.apache.struts2包里面 (常量的默认值)
struts-default.xml 该文件保存在 struts2-core-2.3.7.jar (Bean、拦截器、结果类型 )
struts-plugin.xml 该文件保存在struts-Xxx-2.3.7.jar (在插件包中存在 ,配置插件信息 )

struts.xml 该文件是web应用默认的struts配置文件 (实际开发中,通常写struts.xml ) ********************
struts.properties 该文件是Struts的默认配置文件 (配置常量 )
web.xml 该文件是Web应用的配置文件 (配置常量 )

后加载文件中struts2 常量会覆盖之前加载文件 常量内容
【2.Struts2的Action配置】
1)必须要为元素 配置元素 (struts2 围绕package进行Action的相关配置 )配置package 三个常用属性

name 包名称,在struts2的配置文件文件中 包名不能重复 ,name并不是真正包名,只是为了管理Action
namespace 和 的name属性,决定 Action的访问路径 (以/开始 )
extends 继承哪个包,通常开发中继承 struts-default 包 (struts-default包在 struts-default.xml定义 )
继承struts-default包后,可以使用 包中定义拦截器和结果类型
2)Action的通过元素配置

的name 和 的namespace属性共同决定 Action的访问路径 !!!!!!!!
例如 :


访问路径 /user/hello.action
3) 元素配置默认值
的namespace 默认值 “”
的class 默认值 ActionSupport 类
的 name 默认值 success

【3.默认Action 和 Action的默认处理类 】
1) 默认Action , 解决客户端访问Action不存在的问题 ,客户端访问Action, Action找不到,默认Action 就会执行

2) 默认处理类 ,客户端访问Action,已经找到匹配元素,但是元素没有class属性,执行默认处理类

* 在struts-default.xml 配置默认处理类 ActionSupport
【4.Struts2的常量配置】
1) struts2 默认常量 在 default.properties 中配置
2) 开发者自定义常量
struts.xml (要求)
格式 : <constant name="struts.devMode" value="true" />
struts.properties (要求)
格式 : struts.devMode = true
web.xml 格式

<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.
StrutsPrepareAndExecuteFilter</filter-class>
<init-param>
    <param-name>struts.devMode</param-name>
    <param-value>true</param-value>
</init-param>
</filter>

常用常量

<constant name="struts.i18n.encoding" value="UTF-8"/> 

——–相当于request.setCharacterEncoding(“UTF-8”); 解决post请求乱码

<constant name="struts.action.extension" value="action"/>  

——–访问struts2框架Action访问路径 扩展名 (要求)

struts.action.extension=action,, 

——–默认以.action结尾扩展名 和 不写扩展名 都会分发给 Action

<constant name="struts.serve.static.browserCache" value="false"/> 

——–false不缓存,true浏览器会缓存静态内容,产品环境设置true、开发环境设置false

<constant name="struts.devMode" value="true" />  

——–提供详细报错页面,修改struts.xml后不需要重启服务器 (要求)
【5.struts2 配置文件分离】
通过 <include file="struts-part1.xml"/> 将struts2 配置文件 拆分

5 . Action
HTTP请求 提交 Struts2 StrutsPrepareAndExecuteFilter 核心控制器 —— 请求分发给不同Action
【1.Action书写的的三种格式】
第一种 Action可以是 POJO ((PlainOldJavaObjects)简单的Java对象) —- 不需要继承任何父类,实现任何接口
* struts2框架 读取struts.xml 获得 完整Action类名
* obj = Class.forName(“完整类名”).newInstance();
* Method m = Class.forName(“完整类名”).getMethod(“execute”); m.invoke(obj); 通过反射 执行 execute方法

第二种 编写Action 实现Action接口
Action接口中,定义默认五种 逻辑视图名称
public static final String SUCCESS = “success”; // 数据处理成功 (成功页面)
public static final String NONE = “none”; // 页面不跳转 return null; 效果一样
public static final String ERROR = “error”; // 数据处理发送错误 (错误页面)
public static final String INPUT = “input”; // 用户输入数据有误,通常用于表单数据校验 (输入页面)
public static final String LOGIN = “login”; // 主要权限认证 (登陆页面)

五种逻辑视图,解决Action处理数据后,跳转页面

第三种 编写Action 继承ActionSupport (推荐)
在Action中使用 表单校验、错误信息设置、读取国际化信息 三个功能

【2.Action的配置method(通配符)】
1) 在配置 元素时,没有指定method属性, 默认执行 Action类中 execute方法 <action name="request1" class="com.kz.struts2.demo3.RequestAction1" />
2)在<action> 元素内部 添加 method属性,指定执行Action中哪个方法
<action name="regist" class="com.kz.struts2.demo4.RegistAction"
method="regist"/>
执行 RegistAction 的regist方法, 将多个请求 业务方法 写入到一个Action 类中

    <action name="addBook" class="com.kz.struts2.demo4.BookAction" 
                                                method="addBook" ></action>
    <action name="delBook" class="com.kz.struts2.demo4.BookAction" 
                                                    method="delBook" ></action>   

3) 使用通配符* ,简化struts.xml配置

<a href="${pageContext.request.contextPath }/user/customer_add.action">添加客户</a>
<a href="${pageContext.request.contextPath }/user/customer_del.action">删除客户</a>

等价于在struts.xml进行如下配置

<action name="customer_*" class="com.kz.struts2.demo4.CustomerAction" method="{1}"></action>   ---  {1}就是第一个* 匹配内容

【3.动态方法调用】
1)访问Action中指定方法,不进行配置
第1步: 在工程中使用 动态方法调用 ,必须保证 struts.enable.DynamicMethodInvocation = true 常量值 为true
第2步: 在action的访问路径 中 使用 “!方法名”
jsp页面

<a href="${pageContext.request.contextPath }/user/product!add.action">添加商品</a>

Action配置

<action name="product" class="com.kz.struts2.demo4.ProductAction"></action>

执行 ProductAction 中的 add方法

2)通过动态url

【4.Result结果类型】
Action处理请求后, 返回字符串(逻辑视图名), 需要在struts.xml 提供 元素定义结果页面
1)局部结果页面 和 全局结果页面

<action name="result" class="com.kz.struts2.demo6.ResultAction">
            <!-- 局部结果  当前Action使用 -->
            <result name="success">/demo6/result.jsp</result> 
</action>

<global-results>
            <!-- 全局结果 当前包中 所有Action都可以用-->
            <result name="success">/demo6/result.jsp</result>
</global-results>

2) 结果页面跳转类型
* 在struts-default.xml 定义了 一些结果页面类型
* 使用默认type 是 dispatcher 转发 (request.getRequestDispatcher.forward)

dispatcher : Action 转发给 JSP
chain : Action调用另一个Action (同一次请求)
<result name="success" type="chain">hello</result> hello是一个Action的name
redirect : Action重定向到 JSP
redirectAction : Action重定向到另一个Action

<result name="success" type="redirectAction">hello</result>

6 . 总结
1、 struts2 环境搭建 (导入jar包、web.xml、 struts.xml )
2、 struts2 运行流程
3、 配置文件加载顺序
4、 <package> <action> <result> 元素配置
5、 Action书写三种方式
6、 指定method方法调用、通配符、动态方法调用
7、 Action访问Servlet API
8.关于result标签的 type属性取值.

发布了26 篇原创文章 · 获赞 13 · 访问量 7018

猜你喜欢

转载自blog.csdn.net/womeia331416/article/details/78336933