关闭

struts2入门

标签: strutsjava eestruts2.0
171人阅读 评论(0) 收藏 举报
分类:

Struts2框架介绍

1、三大框架 : 是企业主流 JavaEE 开发的一套架构

Struts2 + Spring + Hibernate

 

2、 什么是框架?为什么要学框架?

框架 是实现部分功能的代码 (半成品),使用框架简化企业级软件开发

学习框架 ,清楚的知道框架能做什么?还有哪些工作需要自己编码实现 ?

 

3、 什么是Struts2 ?

Struts2 是一款优秀MVC框架

 

MVC:是一种思想,是一种模式,将软件分为 Model模型、View视图、Controller控制器

 *MVC由来是web开发

 

JavaEE软件三层结构(三层思想(AOP编程)) : web层(表现层)、业务逻辑层、数据持久层 (sun提供JavaEE开发规范)

JavaEE开发更强调三层结构, web层开发注重MVC

 

struts2就是 web层开发框架,符合MVC模式

 *struts1 、webwork 、jsf 、SpringMVC 都是MVC

 

4、 Struts2 和 Struts1 关系

没有关系, Struts2 全新框架,引入WebWork很多技术和思想,Struts2 保留Struts1 类似开发流程

 *Struts2 内核webwork 

 

Xwork提供了很多核心功能:前端拦截机(interceptor),运行时表单属性验证,类型转换,强大的表达式语言(OGNL – the ObjectGraph Navigation Language),IoC(Inversion ofControl反转控制)容器等

Struts2快速入门

1、下载开发包

最新版本 2.3.15.1

课程 以2.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-class>

  </filter>

  <filter-mapping>

      <filter-name>struts2</filter-name>

      <url-pattern>/*</url-pattern>

  </filter-mapping>

 

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

    <package name="default"namespace="/" extends="struts-default">

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

              <!-- 将请求 分发给一个Action-->

              <!-- action的name 就是hello.action去掉扩展名  -->

              <action name="hello"class="cn.xxxx.struts2.demo1.HelloAction"></action>

    </package>

 

7、执行目标Action中execute方法

 

8、在Action的execute方法中返回 字符串7,在struts.xml中配置字符串与页面对应关系

<resultname="executesuccess">/demo1/success.jsp</result>  完成结果页面跳转

Struts2流程分析

1、运行流程

请求 ----StrutsPrepareAndExecuteFilter 核心控制器 ----- Interceptors 拦截器(实现代码功能 ) ----- Action 的execuute --- 结果页面 Result

* 拦截器在 struts-default.xml定义

* 执行拦截器是 defaultStack 中引用拦截器

 

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

 

2、配置struts.xml 提示问题

 如果安装Aptana编辑器 ,请不要用Aptana自带xml编辑器 编写struts2配置文件

 struts.xml提示来自于 DTD约束,

       <!DOCTYPEstruts PUBLIC

       "-//ApacheSoftware Foundation//DTD Struts Configuration 2.3//EN"

       "http://struts.apache.org/dtds/struts-2.3.dtd">

       如果可以上网,自动缓存dtd,提供提示功能

       如果不能上网,也可以配置本地DTD提示

 

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

 

3、关联struts2源码

 

Struts2配置

学习路径

1)、 struts.xml常量配置(配置文件顺序)、Action访问(Servlet API)、结果集 (使用Struts2 编写简单案例)

2)、请求数据

3)、响应页面生成

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常量会覆盖之前加载文件常量内容

Struts2的Action配置

1)必须要为<action>元素 配置<package>元素 (struts2 围绕package进行Action的相关配置 )

       配置package 三个常用属性

              <packagename="default" namespace="/"extends="struts-default">

              name包名称,在struts2的配置文件文件中 包名不能重复 ,name并不是真正包名,只是为了管理Action

              namespace和<action>的name属性,决定 Action的访问路径  (以/开始 )

              extends继承哪个包,通常开发中继承struts-default 包 (struts-default包在 struts-default.xml定义 )

                     *继承struts-default包后,可以使用 包中定义拦截器和结果类型

 2)Action的通过<action>元素配置

       <actionname="hello" class="cn.xxxx.struts2.demo1.HelloAction">

       <action>的name 和 <package>的namespace属性 共同决定 Action的访问路径 !!!!!!!!

      

       例如 :

               <package name="default"namespace="/user" extends="struts-default">

                 <action name="hello"class="cn.xxxx.struts2.demo1.HelloAction">

               访问路径 /user/hello.action

 3)<action> 元素配置默认值

   <package> 的namespace 默认值 /

       <action>的class 默认值 ActionSupport 类

       <result>的 name 默认值 success

 

默认Action Action的默认处理类

1)默认Action , 解决客户端访问Action不存在的问题 ,客户端访问Action, Action找不到,默认Action 就会执行

   <default-action-ref name="action元素的name" />

 

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

   <default-class-ref class="完成类名" />

       *在struts-default.xml配置默认处理类ActionSupport

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>

 

3)常用常量

       <constantname="struts.i18n.encoding" value="UTF-8"/>  ----- 相当于request.setCharacterEncoding("UTF-8"); 解决post请求乱码

       <constantname="struts.action.extension" value="action"/>  --- 访问struts2框架Action访问路径 扩展名(要求)

              *struts.action.extension=action,, 默认以.action结尾扩展名 和 不写扩展名 都会分发给 Action

       <constantname="struts.serve.static.browserCache" value="false"/>false不缓存,true浏览器会缓存静态内容,产品环境设置true、开发环境设置false

       <constantname="struts.devMode" value="true" />  提供详细报错页面,修改struts.xml后不需要重启服务器 (要求)

struts2 配置文件分离

通过 <includefile="struts-part1.xml"/> 将struts2 配置文件 拆分

Action

HTTP请求提交 Struts2StrutsPrepareAndExecuteFilter 核心控制器 ------ 请求分发给不同Action

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接口中,定义默认五种 逻辑视图名称

       publicstatic final String SUCCESS = "success";  // 数据处理成功(成功页面)

       publicstatic final String NONE = "none"; // 页面不跳转  return null; 效果一样

       publicstatic final String ERROR = "error"; // 数据处理发送错误 (错误页面)

       publicstatic final String INPUT = "input"; // 用户输入数据有误,通常用于表单数据校验 (输入页面)

       publicstatic final String LOGIN = "login"; // 主要权限认证 (登陆页面)

 

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

 

第三种 编写Action  继承ActionSupport  (推荐

   在Action中使用 表单校验、错误信息设置、读取国际化信息三个功能

Action的配置method(通配符)

1)在配置 <action> 元素时,没有指定method属性, 默认执行 Action类中 execute方法

          <action name="request1"class="cn.xxxx.struts2.demo3.RequestAction1" />

2)在<action> 元素内部 添加 method属性,指定执行Action中哪个方法

          <action name="regist"class="cn.xxxx.struts2.demo4.RegistAction"method="regist"/> 执行 RegistAction 的regist方法

          * 将多个请求业务方法 写入到一个Action 类中

       <actionname="addBook" class="cn.xxxx.struts2.demo4.BookAction"method="addBook" ></action>

       <actionname="delBook" class="cn.xxxx.struts2.demo4.BookAction" method="delBook"></action>  

      

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

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

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

      

       struts.xml

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

Action访问Servlet

1、 在Action 中解耦合方式 间接访问 Servlet API  --------- 使用ActionContext 对象

在struts2 中 Action API 已经与 Servlet API 解耦合 (没有依赖关系 )

* Servlet API 常见操作 : 表单提交请求参数获取,向request、session、application三个范围存取数据

 

actionContext = ActionContext.getContext();

1) actionContext.getParameters(); 获得所有请求参数Map集合

2) actionContext.put("company","xxxx"); / actionContext.get("company") 对request范围存取数据

3) actionContext.getSession(); 获得session数据Map,对Session范围存取数据

4) actionContext.getApplication(); 获得ServletContext数据Map,对应用访问存取数据

 

2、 使用接口注入的方式,操作Servlet API (耦合)

ServletContextAware : 注入ServletContext对象

ServletRequestAware :注入 request对象

ServletResponseAware : 注入response对象

 

* 程序要使用哪个Servlet的对象,实现对应接口

 

3、 在Action中直接通过 ServletActionContext 获得Servlet API

ServletActionContext.getRequest() : 获得request对象 (session)

ServletActionContext.getResponse() : 获得response 对象

ServletActionContext.getServletContext() : 获得ServletContext对象

* 静态方法没有线程问题,ThreadLocal

Result结果类型

Action处理请求后,返回字符串(逻辑视图名), 需要在struts.xml 提供 <result>元素定义结果页面

1、 局部结果页面 和 全局结果页面

<action name="result"class="cn.xxxx.struts2.demo6.ResultAction">

                    <!-- 局部结果 当前Action使用 -->

                    <resultname="success">/demo6/result.jsp</result>

</action>

 

<global-results>

                     <!--全局结果 当前包中所有Action都可以用-->

                     <resultname="success">/demo6/result.jsp</result>

</global-results>

 

2、 结果页面跳转类型

       *在struts-default.xml定义了 一些结果页面类型

       *使用默认type 是 dispatcher 转发 (request.getRequestDispatcher.forward)

 

1)   dispatcher:Action 转发给 JSP

2) chain :Action转发到另一个Action (同一次请求)

       <resultname="success" type="chain">hello</result>  hello是一个Action的name

3) redirect : Action重定向到 JSP

4) redirectAction :Action重定向到另一个Action

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

总结

1、 struts2 环境搭建 (导入jar包、web.xml、 struts.xml )

2、 struts2 运行流程

3、配置文件加载顺序

4、 <package> <action> <result> 元素配置

5、 Action书写三种方式

6、指定method方法调用、通配符、动态方法调用

7、 Action访问Servlet API 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:6547次
    • 积分:425
    • 等级:
    • 排名:千里之外
    • 原创:36篇
    • 转载:10篇
    • 译文:0篇
    • 评论:0条