您的位置:首页 > 编程语言 > Java开发

struts2课堂笔记

2013-12-08 22:51 537 查看
========================

目录:

1.为什么学习Struts框架

2.MVC模式在JavaWeb中的应用

3.了解Struts历史

4.HelloWord入门实例

5.项目示例(资费列表显示)

6.OGNL技术的使用

7.OGNL技术在Struts的使用

8.Action组件的相关使用

9.stream Result组件

10.json Result组件

11.Struts2表单标签

12.拦截器组件

========================

 

 

 

 

 

 

 

====================

day01

====================

梁建全 liangjq@tarena.com.cn

------------------------------------------

1.为什么学习Struts框架

   a.Struts框架好处

    --简化开发工作量,提高开发效率

    --采用了优秀的设计思想(MVC)

   b.如何学习Struts框架

     先重点掌握框架使用,原理性有余力可以多了解些。

2.MVC模式在JavaWeb中的应用

   *a.什么是MVC

      MVC思想就是根据组件职责不同,将系统中组件分成以下3个组成部分。

     --V视图:负责与用户交互,一种是展示数据,另一种是接收数据。

     --M模型:负责业务处理,一种是业务逻辑模型,另一种是数据模型。

     --C控制器:负责协调视图部分和模型部分协同工作。

   b.为什么使用MVC

     企业程序更强调结构灵活,易于扩展和升级。所以广泛选用MVC模式开发。

   *c.JavaWeb中如何实现MVC结构

    JavaWeb技术主要有:Servlet,JSP,JavaBean,Filter,Listener等

    V部分:JSP组件 (cart.jsp)

    M部分:JavaBean组件(entity,dao)

    C部分:Servlet,Filter组件 (ShoppingCartServlet)

 *d.MVC处理流程

   --首先浏览器发出请求

   --请求进入C控制器

   --C控制器调用M模型组件处理

   --M模型组件处理后返回处理结果

   -- C控制器调用V视图组件生成响应信息

 *e.Struts框架的MVC实现

    原有ShoppingCart程序,虽然符合MVC结构,但不适合大型项目开发,因为请求一多,ShoppingCartServlet会出现大量的if..else... ,可以进行以下方式的改造

   为ShoppingCartServlet配置一个XML文件,该文件定义不同请求和不同Action组件的对应关系,将原有if..else..分支处理用Action组件封装。  

  **f.Struts框架的处理流程

    --浏览器发出struts请求

    --请求进入struts控制器

    --struts控制器解析xml配置文件

       (xml定义了请求和Action对应关系)

   --控制器根据不同请求,调用不同的Action

   --Action调用DAO处理请求,之后返回结果

   --控制器根据结果调用视图组件为用户响应

3.了解Struts历史

   Struts框架分成Struts1和Struts2.Struts2和Struts1没有必然联系。Struts2是以WebWork框架核心(xwork)为基础构建起来

*4.Struts基本使用

   a.引入struts2核心开发包(5个)

      --struts2-core-2.1.8.jar (核心包)

      --xwork-core-2.1.6.jar  (webwork内核包)

      --commons-fileupload-1.2.1.jar (上传包)

      --ognl-2.7.3.jar (OGNL表达式工具包)

      --freemarker-2.3.15.jar (模板视图工具包)

     

   b.在web.xml中配置下struts控制器

   c.根据请求编写Action,JSP

   d.在struts.xml定义Action和请求对应关系

5.HelloWord入门实例

welcome.action-->Struts控制器

-->struts.xml-->WelcomeAction

-->welcome.jsp

(Action请求可以是/welcome.action或者/welcome两种写法)

======struts.xml基本配置========

struts.xml放在src根目录下。

a) <struts>根元素,可以包含多个<package>元素

b)<package>元素主要用于将Action分组定义。name属性用于指定包名;extends一般指定为struts-default。struts-default这个包在struts-default.xml中定义,其中包含了struts2运行所需的必要组件。

c)一个<package>元素可以包含多个<action>.<action>主要用于定义请求和Action组件的对应关系。name属性指定请求名;class属性指定Action的包名.类名

d)一个<action>元素可以包含多个<result>.

<result>主要用于定义视图响应。name属性与Action.execute()返回值一致。

=======================

扩展HelloWorld示例

a.隐藏JSP组件

b.从WelcomeAction向Welcome.jsp传值

c.WelcomeAction接收welcome.action请求带过来的表单信息

d.页面跳转可以采用下面配置

  <action name="请求名">

     <result name="success">

       jsp页面 

     </result>

 </action>

如果不指定class属性,会默认调用框架底层的ActionSupport类处理。

6.项目示例(资费列表显示)

a.显示默认主页面

 index.action-->struts控制器-->index.html

b.资费列表显示

feeList.action-->struts控制器

-->FeeListAction-->FeeDAO-->COST

-->fee_list.jsp

  1)编写COST对应的Entity实体类

  2)编写DAO,DBUtil

     --引入oracle驱动包

  3)编写Action

  4)配置Action

  5)编写JSP

    --引入jstl.jar,standard.jar

==========课后练习==================

1.完成helloworld示例

2.完成资费列表显示示例

====================

 day02

====================

------------回顾---------------

1.了解Struts2的MVC实现,及其工作流程

2.掌握Struts2的核心应用

-------------------------------

任务描述:

  1)为资费列表添加分页功能

1页:1-2

2页:3-4

3页:5-6

page=1

pageSize=2

int begin = (page-1)*pageSize+1;

int end = page*pageSize;

select * from

(select rownum rn,c.*

from COST c where rownum<=6)

where rn>=5

  2)利用Struts2标签+OGNL技术重构资费列表

--------------------------------

1.OGNL技术的使用

  1)什么是OGNL

  源于ognl.jar工具包

  Object Graphics Navigation Language

  (对象图导航语言)

  主要用于访问对象的数据和方法。

  2)OGNL基本原理

    OGNL工具主要由3部分构成,具体如下

    a.OGNL引擎

        负责解析ONGL表达式,定位数据

    b.Root根存储区(Object类型)

        负责存储要访问的目标对象。

    c.Context变量存储区(Map类型)

        负责存放多个要访问的目标对象。

  *3)OGNL基本语法

    a.访问Root区域对象基本语法

 --访问简单数据:"属性" 例如"name"

 --访问数组或List集合:"属性[0]"

     例如"arr[1]"

 --访问Map集合:"属性['key']"或"属性.key"

    例如"map.two"或"map['two']"

 --访问方法:"属性值.方法()",

   例如"list.size()"

 --访问构造方法:"new 包名.构造方法"

    例如"new java.util.Date()"

 --访问静态成员:"@包名.类名@成员"

    例如"@java.lang.Math@PI"

 --创建List对象:"{元素1,元素2}"

 --创建Map对象:

    "#{key1:value1,key2:value2}"

b.访问Context区域对象基本语法

   采用"#Key"开头.

2.OGNL技术在Struts的使用

  在Struts2中有一个ValueStack数据对象,该对象存储了请求相关的所有数据信息。例如request,session,application,action等.

  Struts2采用OGNL工具对ValueStack进行操作。

  1)xwork对OGNL进行了部分改造

    在xwork中将原来OGNL标准结构中的Root存储区改造成了一个栈结构(CompoundRoot)

    当利用"属性"表达式访问时,优先去栈顶对象寻找,没有再去次栈顶寻找。

2)ValueStack结构(OgnlValueStack)

    (参考valuestack.jpg)

3)Struts2标签的使用

  在JSP中,利用Struts2标签显示数据,需要为标签指定OGNL表达式,标签利用表达式定位ValueStack中的数据,进行相应操作。

  

  a) debug标签:显示valuestack状态

  b) iterator标签:循环集合元素

    value属性:指定ognl

    var属性:指定循环变量,会被存放到                     ValueStack的context区域。

    status属性:指定循环状态变量,会被存放到ValueStack的context区域.该变量有count属性表示一共循环了多少个元素。

index属性表示当前循环元素的索引。

    

   c) if...else...标签:判断分支

       test属性:指定ognl判断表达式

   d) property标签:显示数据

       value属性:指定ognl表达式

   e) date标签:将date数据格式化输出

       name属性:指定ognl表达式

       format属性:指定日期模板

====================

        day03

====================

 ------------总结------------

 1.了解ValueStack结构

 2.Struts2标签+OGNL基本法

 ------------------------------

 1)登录-->如何使用session,request

 2)控制一页显示几条记录-->Action属性注入

 3)资费记录删除-->result组件使用

 -------------------------------

 1.Action组件的相关使用

    1)Action组件的原理

        --客户发出action请求给struts控制器

        --struts控制器会创建valuestack对象

        --struts控制器根据请求创建Action对象 

           并将Action压入valuestack的root栈顶

        (Action线性安全,不用考虑并发问题)

        --struts控制器将请求相关request,

           session对象放入到valuestack的          context区域

        --struts控制器执行Action对象的execute方法处理请求

        --struts控制器根据execute结果生成响应信息输出。

        --请求处理完毕,销毁valuestack和Action对象。

         

    *2)Action中如何使用session,request

         a.利用ActionContext和ServletActionContext工具类

          ActionContext返回是Struts框架封装成Map之后的request,session,application.

         ServletActionContext返回的是Servlet中使用的request,session,application原有类型。

         (使用建议:存值取值建议用Map结构API,如果有特殊需求再采用Servlet原有类型)

    3)Action属性注入

    4)Action通配符配置

 login.action-->LoginAction-->AdminInfoDAO

 -->admin_info

 ----如何将原有HttpSession封装成Map------

 public class SessionMap extends AbstractMap{

     private HttpSession session;  

      public SessionMap(HttpSession session){

           this.session = session;

     }

       public void put(Object key,Object val){

           session.setAttribute(key,val);

      }

      public Object get(Object key){

          session.getAttribute(key);

      }

 }

====================

     day04

====================

 -----------前期课程回顾-------------

 1)第一天

    理论:Struts2的MVC结构和处理流程

    技能:掌握Struts2基本使用

 2)第二天

    理论:Struts2中ValueStack结构

    技能:OGNL基本语法

               Struts2常规标签

 3)第三天

     理论:Action原理,Result原理

     技能:Request,Session等对象使用

                Action属性注入

               dispatcher,redirect,

               redirectAction,chain

 =========补充EL问题===========

 在JSP中,利用EL表达式可以从page,request,session,application范围取值显示。

 在Struts2中,利用EL表达式可以page,

 request,valuestack(root),

 session,application.

 原因是Struts2将原有Request对象进行了封装。

 public class StrutsRequestWrapper extends HttpServletRequestWrapper{

  

      // 重写

      public Object getAttribute(String key){

            // 寻找原request信息

            Object obj = super.getAttribute(key);

            if(obj == null){

               // 寻找valuestack信息

                obj = valuestack.findValue(key);

               // Ognl.getValue(key,context,root);

            }

            return obj;

      }

 }

 ${name} -->request.getAttribute("name")

 -->Ognl.getValue("name",context,root)

 =========第四天===========

 1.任务描述

    1)完成登录验证码-->stream Result

    2)完成资费添加-->json Result

    3)完成资费更新-->Struts2表单标签

 2.stream Result组件

    主要负责将Action中的一个InputStream类型的属性以字节流方式输出。

 验证码功能流程设计:

 image.action-->ImageAction-->stream响应------------------------------

 练习:大家练习下上午的验证码示例

 ------------------------------

 3.json Result组件

    主要负责将Action的属性以json字符串格式输出。

    json Result的使用步骤:

    a.引入struts2-json-plugin.jar

    b.将<package>元素的extends继承

        "json-default"

    c.<result>使用配置

      // 只返回Action中一个属性值

   <result  type="json">

        <param name="root">属性名</param>

   </result>

     // 返回Action中多个属性值

   <result  type="json">

        <param name="includeProperties">

        属性名1,属性名2,属性名3

       </param>

   </result>

    // 返回Action中所有属性值

   <result  type="json">

   </result>

 ---------------------------------------

 资费添加前,检测资费名称是否重复操作。

 流程设计:

 焦点离开时-->(ajax)-->validFeeName.action

 -->ValidFeeNameAction-->FeeDAO

 -->json (result)返回一个检测结果

 -->ajax回调函数处理

 =========练习===========

 1.完成资费添加处理

 fee_add.action-->FeeAction-->FeeDAO

 -->fee_add.jsp

 2.完成登录处理

 3.扩展要求:完成资费更新,查看处理

 ====================

      day05

 ====================

1.Struts2表单标签

标签封装了界面显示逻辑,用于简化JSP。

a) textfield

 以输入框方式显示属性值.

 name属性指定ognl表达式

b) textarea

 以文本域方式显示属性值.

 name属性指定ognl表达式

c) radio

  以一组单选框方式显示,并可以根据属性值决定哪个选项选中。

list属性指定集合ognl,用于生成若干radio选项。

name属性指定ognl,用于决定哪个raido选中。

---------资费更新操作---------

1)把以前数据调出来显示

fee_load.action-->FeeAction-->FeeDAO

-->fee_modi.jsp

2)把修改后的表单数据保存到数据库

fee_update.action-->FeeAction-->FeeDAO

-->fee_modi.jsp(提示成功还是失败)

 ====================

      day06

 ====================

1

1.拦截器组件

  Struts2框架提供了大量的拦截器组件,如果不能满足开发者需要,可以进行自定义。

  一般利用拦截器封装一些通用性功能。例如请求参数给action赋值,文件上传,权限检查等。

 1)拦截器作用

    拦截器可以在Action和Result组件调用之前执行,也可以在Action和Result组件之后执行。

 2)拦截器原理

    a.所有拦截器组件实现类都必须实现Interceptor接口的interceptor方法。

   public class MyInterceptor implements

Interceptor{

      public String intercept

                   (ActionInvocation in){

           // 拦截器的前期处理逻辑

           in.invoke();// 执行Action和Result

        // in.invokeActionOnly();//仅执行Action

           // 拦截器的后期处理逻辑

      }

}

   注意:intercept 方法返回的String,当内容部执行了invoke()方法时,返回值无效。如果没有执行invoke(),返回值有效。控制器会根据该返回值调用一个Result生成响应信息

   b.所有拦截器都具有下列注册配置

<package>

   <interceptors>

       <interceptor name="拦截器名"

                class="拦截器实现类"/>

       <interceptor name="" class=""/>

   </interceptors>

</package>

 

  c.拦截器的使用

   --为所有Action指定默认使用配置

   <package>

        <default-interceptor-ref

            name="拦截器名"/>

  </package>

   --为某一个Action指定使用配置

   <action>

      <interceptor-ref name="拦截器名"/>

  </action>

   注意:如果为某个Action指定了拦截器配置,不会再调用指定的默认拦截器.

3)fileUpload内置拦截器的使用

   a)fileUpload拦截器功能

       用于实现文件上传功能。

     首先fileUpload拦截器调用上传组件对请求提交的表单信息进行解析。

      然后将解析出的上传文件放置在一个临时目录下。并将该文件对象给Action的File属性赋值。

       执行Action和Result组件处理。

     最后将临时目录下的上传文件删除。

   b)上传示例

     注意事项:

      --需要引入commons-io.jar)

      --form表单method必须为post;enctype必须为multipart/form-data

      --Action组件按下面规则接收表单信息

          <input type="file" name="xxx">

        Action属性如下:

          private File xxx;

          private String xxxFileName;

          private String xxxContentType;

 

===========

 总结\:

===========

          ----------Struts2课程总结-----------

          1)第一部分

            理论:Struts2的MVC结构和流程

                   (参考struts2流程图)

            技能:Struts2基本使用

          2)第二部分

            理论:了解ValueStack结构和OGNL语法

            技能:利用Struts2标签显示数据

                        利用Struts2标签表单标签显示数据

          3)第三部分

            理论:Action组件原理

            技能:Action组件相关应用

                       --request,session等使用

                       --Action属性注入

                       --通配符配置

          4)第四部分

             理论:了解Result组件的原理

             技能:掌握常用的Result组件的使用

                  --JSP : dispatcher(默认),redirect

                  --Action : chain,redirectAction

                  --Stream : stream

                  --JSON : json

          5)第五部分

              理论:了解拦截器组件的原理

              技能:掌握拦截器组件的使用

                 --掌握如何自定义一个拦截器

                 --如何使用fileUpload实现文件上传

 

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: