struts2课堂笔记

来源:互联网 发布:人力资源软件有哪些 编辑:程序博客网 时间:2024/05/17 04:26


========================
目录:
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实现文件上传