Struts1.X学习笔记

 

 

Struts1.X学习笔记 8月28日

2009   

[在此处键入文档的摘要。摘要通常是对文档内容的简短总结。在此处键入文档的摘要。摘要通常是对文档内容的简短总结。] MVC框架以及标签的使用  

 

 

Structs1.x框架工作流程

方法介绍

Action是Struct父接口,其中里面的方法是public ActionForward

execute(ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response){}

throws Exception

ActionForm是获取表单中的数据

ActiionForward是进行转向处理

工作流程

response

dispatch

response

request

JSP

 

 

Struts  Taglib(标签)

Struts 标签的配置和使用

配置:

* 在struts-config.xml文件中加入

* 拷贝MessageResources.properties文件到src下

使用:

* 采用taglib指令引入

<%@ taglib prefix="bean" uri="http://struts.apache.org/tags-bean"%>  

<%@ taglib prefix="logic" uri="http://struts.apache.org/tags-logic"%> 

 

Struts  常使用的标签如下:

等同于request.getAttribute(“”)/或是request.getPrameatery(“”)

 

是逻辑判断标记相当于if else

 

 

JSTL标签的使用(学习的重点,必须掌握)

简介:SUN的标准taglib库

Jsp标准标签库(jsp standard Tag Library,JSTL)

迭代和条件判断

数据管理格式化

XML操作

数据库访问

函数标签库

表达式语言(EL)

El隐式对象

存取器

运算符

EL实例如下:

测试EL表达式



  • 普通字符串

  • hello(jsp脚本):<%=request.getAttribute("hello") %>

    hello(el表达式,el表达式的使用方法$和{}):${hello }

    hello(el表达式,el的隐含对象pageScope,requestScope,sessionScope,applicationScope,
    如果未指定scope,它的搜索顺序为pageScope~applicationScope):${requestScope.hello }

    hello(el表达式,scope=session):${sessionScope.hello }

  • 结构,采用.进行导航,也称存取器

  • 姓名:${user.username }

    年龄:${user.age }

    所属组:${user.group.name }

  • 输出map,采用.进行导航,也称存取器

  • mapvalue.key1:${mapvalue.key1 }

    mapvalue.key2:${mapvalue.key2 }

  • 输出数组,采用[]和下标

  • strarray[2]:${strarray[1] }

  • 输出对象数组,采用[]和下标

  • userarray[3].username:${users[2].username }

  • 输出list,采用[]和下标

  • userlist[5].username:${userlist[4].username }

  • el表达式对运算符的支持

  • 1+2=${1+2 }

    10/5=${10/5 }

    10 div 5=${10 div 5 }

    10%3=${10 % 3 }

    10 mod 3=${10 mod 3 }

     

  • 测试empty

  • value1:${empty value1 }

    value2:${empty value2 }

    value3:${empty value3 }

    value4:${empty value4 }

    value4:${!empty value4 }

    JSTL_核心库标签

    测试jstl核心库


  • 测试c:out

  • hello(default):

    hello(el表达式):${hello }

    hello(default="123"):

    hello(default="123"):123

    bj(defalut):

    bj(escapeXml="true"):

    bj(escapeXml="false"):

    bj(el表达式):${bj }

  • 测试c:set和c:remove

  • temp:${temp }

    temp:${temp }

  • 测试条件控制标签c:if

  • v1小于v2
    v=${v }

    v3为空

    v4为空

  • 测试条件控制标签c:choose,c:when,c:otherwise

  • v1小于v2

    v1大于v2

    v4为空

    v4不为空

  • 测试循环控制标签c:forEach

  • 姓名 年龄 所属组
    没有符合条件的数据!
    ${u.username } ${u.age } ${u.group.name }

  • 测试循环控制标签c:forEach,varstatus

  • 姓名 年龄 所属组
    没有符合条件的数据!

  • 测试循环控制标签c:forEach,begin,end,step

  • 姓名 年龄 所属组
    没有符合条件的数据!
    ${user.username} ${user.age} ${user.group.name }

  • 测试循环控制标签c:forEach,普通循环

  • a

  • 测试循环控制标签c:forEach,输出map

  • ${v.key }=${v.value }

  • 测试循环控制标签c:forTokens

  • ${v }

  • 测试c:catch

  • <%

    try {

    Integer.parseInt("asdfsdf");

    }catch(Exception e) {

    out.println(e.getMessage());

    }

    %>

    <%

    Integer.parseInt("asdfsdf");

    %>

    ${exinfo }

  • 测试c:import

  • 测试c:url和c:param

  • ${v }

  • 测试:redirect

  •  

    Jstl格式化标签的使用

    实例

  • fmt时间格式化

  •     date(default):

        d=${d}

        date(type="time"):

        date(type="date"):

         date(type="both" ):

         date(type="both" dateStyle="long"):

         date(type="both" dateStyle="full"):

         date(type="both"  timeStyle="full"):

         date(type="both" pattern="yyyy-mm-dd hh-mm=ss" ):

         

  • 数字的 格式化

  •      数字的格式化(default):

         数字格式化(type="number"):

       
    数字格式化 (type="currency"):

        总共的金额是:${m}

      百分比(pdate type="percent" ):

    ${p}

    JSTL函数库(以及自定义函数库)

    自定义函数的规则

    jstl_fn自定义函数库:

    1、定义类和方法(方法必须是public static)

    2、编写自定义tld文件,并且将此文件放到WEB-INF或WEB-INF任意子目录下

    3、在jsp中采用taglib指令引入自定义函数库

    4、采用 前缀+冒号+函数名 调用即可

    实例

    jstl函数库的测试

       

  • 和那书库的测试

  •     hello(jsp 脚本):<%=((String)request.getAttribute("hello")).length() %>

        helo(jstl函数库,函数调用必须在el表达式中 前缀+冒号+函数名):${fn:length(hello)}

        list集合的长度:${fn:length(list) }

       

  • 自定义和那书库的测试

  • sayHello(自定义函数):${myfunction:sayhello(name)}

     

     

     

    动态ActionForm(可以动态的获取页面提交的数据)

    1、动态ActionForm

    动态ActionForm是为了避免标准ActionForm膨胀而设计的,使用动态ActionForm可以获得标准

    ActionForm的所有功能

    * 在struts-config.xml文件中定义动态ActionForm,如:

    *在Action中使用动态ActionForm,参见DynaActionFormTestAction.java 使用了DynaActionForm累中get的方法

    DynaActionForm daf = (DynaActionForm)form;

    String username = (String)daf.get("username");

    Integer age = (Integer)daf.get("age");

    注意:DynaActionForm是Struct1.x自带的一个类

    动态ActionForm其实是把页面中的html元素的名字和值放到了map中,所以通过get方法可以取出相应的值

    动态ActionForm采用EL表达式的输出方式,${dynabean.map.prop}, 参见:dyna_actionform.jsp

    动态Action的验证,通常使用动态验证框架validator

     

    2、采用struts上传文件

    * 页面的配置,如:

     

      标题:

      文件:

     

     

      * ActionForm中使用FormFile来接收上传的文件,参见:UploadActionForm.java

      * 在Action中调用FormFile取得上传文件数据,采用流输出,即完成上传,参见:UploadTestAction.java

      * 采用标签配置上传参数,如:

     

     

    3、空字段测试

    * 在表单中没有input输入域,jsp脚本接收到的值为null,el表达式接收到的值为空串

    * 如果表单中的值,没有输入,那么jsp脚本和el表达式接收到的值都为空串

    4测试ActionForm类型的自动转换

    * boolean:yes,1,on,true都会转换成True类型,而且忽略大小写,其他情况转换成false

    * Date类型的转换:

    * 如果是java.sql.Date,页面日期的格式必须为yyyy-mm-dd,才可以转换

    * 如果是java.util.Date,默认情况下struts无法转换

     

    * 自定义转换器的实现步骤

    * 实现converter接口,实现convert方法

    * 将实现的conerter注册,通常情况采用servlet注册

    * 采用servlet注册需要注意标签的配置,10(也可以采用struts plugin注册)

    Struts对ActionForm的自动搜集过程:

      * 将页面数据放到map中,其中map中的key为页面中的名称,map中的value为页面中的value值

      * 调用BeanUtils.setProperties方法,将map中的值逐个设置到ActionForm实例上,对于ActionForm中的每个属性

        根据类型调用相应的Converter,然后调用相应的convert方法,将相应的字符串转换成ActionForm中指定的类型

     

    可以通过BeanUtils.copyProperties(目标对象,源对象)方法进行对象值的复制。

     

     5.ActionForward知识点复习

     

    ActionForward的使用

     

    1、理解全局和局部ActionForward的概念

    2、redirect的使用

    3、struts-config.xml文件不允许动态修改

    4、理解动态ActionForward,动态的ActionForward是可以运行期修改的

     

     

     6.ActionMapping的复习

    1、struts-config.xml文件中,每个标签对应一个ActionMapping实例

    2、了解标签中的forward和unknown属性的含义

    3、了解采用jstl和struts标签保持页面数据

     

    7. 分布数据

     

    8.struts 国际化

    Java中的国家化问题

      1、了解缺省Locale是由操作系统决定的,Locale是由语言和国家代码组成

     

    2、国际化资源文件是由baseName+locale组成,如:MessageBundle_en_US.properties

    baseName是任意合法的文件名

     

    3、native2ascii命令的位置和用法

    * 位置:JAVA_HOME/bin

    * 使用native2ascii.exe  o.properties MessagesBundle_zh_CN.properties

    4.

    eg

    Locale defaultl=Locale.getDefault();

    System.out.println(defaultl.getCountry());

    System.out.println(defaultl.getLanguage());

    ResourceBundle r=ResourceBundle.getBundle("res.MessagesBundle", defaultl);

    System.out.println(r.getString("k1"));

    System.out.println(r.getString("k2"));

    MessageFormat mf=new MessageFormat(r.getString("k1"),defaultl);

    Object[] o={"wulinbo","早撒谎那个好"};

    System.out.println("使用国际化处理(动态处理的国际化 )"+mf.format(new Object[]{"吴林波","早上好"}));

    System.out.println("使用国际化处理(动态处理的国际化 )"+mf.format(o));

    Struts国际化问题

    概念区分

    硬编码国际化(指的是静态中文转换为其他的一种语言)

    动态编码国际化(是指的是程序在运行期间的代码的国际化,可以使用占位符)

    1、struts国际化的配置

    * 在struts-config.xml文件中加入:

    2、提供不同版本的国际化资源文件,中文需要采用native2ascii转换成unicode

     

    3、在jsp中采用标签来读取国际化消息文本

     

    4、了解利用struts默认将locale放到session中的特性,完成采用编程的方式切换语言设置

    * 参见:ChangeLanguageAction.java 如下

    String language=request.getParameter("language");

    Locale defaultl=Locale.getDefault();

    if(language.equals("CN"))

    {

    defaultl=new Locale("zh","CN");

    }

    else if(language.equals("US"))

    {

    defaultl=new Locale("en","US");

    }

    //使用struts中的方法 是一种session  HttpSession session =request.getSession()

    //session.setAttribute("","");

    request.getSession().setAttribute(Globals.LOCALE_KEY, defaultl);//import org.apache.struts.Globals;

    //this.setLocale(request, defaultl);//使用Action中自己带的SetLocal来设置本地语言

    return mapping.findForward("lanChange");

     

    5、消息文本的国际化处理,共有三个步骤:

    * 创建国际化消息

    * 传递国际化消息

    * 显示国际化消息

    如何创建国际化消息?

    理解ActionMessage和ActionMessages两个对象的区别

    如何传递国际化消息?

    * 调用saveMessage()传递普通消息,调用saveErrors传递错误消息

    如何显示国际化消息?

    通过标签显示消息(可以显示普通消息和错误消息)

    通过

    了解 使用JSTL标签中的fmt格式化标签来国家化

     首先在.jsp文件的头文件上添加

    <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>

      其中properties文件放在res文件中

     

    其次使用如下




    ">

     

    struts异常处理

    1、编程式异常

    * 截获异常

    * 创建相应的异常消息

    * 传递异常消息

    * 转向相应的页面处理异常

    2、声明式异常(自动处理的异常)

    * 在struts-config.xml文件中配置标签

    * 理解局部和全局exception

    * 注意局部标签需要配置到标签的前面,详见dtd中的约束

    标签中的属性说明:

    * key:指异常信息对应的国际化消息文本,这个key值需要在国际化资源文件中定义

    * type: 处理那种异常

    * path: 定义一但出现异常,需要转向那个页面,如果不定义path,

            默认情况下将使用标签中input属性对应的页面

    * scope:可以取值request和session,默认为request

    * handler:异常的处理类,struts默认采用org.apache.struts.action.ExceptionHandler,

               如果做个性化的异常处理可以继承此类覆写相应的方法

               

    参见:ErrorCodeExceptionHandler.java和AppExceptionHandler.java

               

    DispatchAction应用

    可以减少struts配置文件中的action量

    如下例子:

    配置文件

       

         

           

    userAction类处理

    主要是继承了dispatchAction 该类

    public class userAction extends DispatchAction {

     

    public ActionForward add(ActionMapping mapping, ActionForm form,

    HttpServletRequest request, HttpServletResponse response) throws Exception {

    // TODO Auto-generated method stub

    //return mapping.findForward("add_success");

    return mapping.findForward("success");

    }

    public ActionForward del(ActionMapping mapping, ActionForm form,

    HttpServletRequest request, HttpServletResponse response) throws Exception {

    // TODO Auto-generated method stub

    //return mapping.findForward("del_success");

    return mapping.findForward("success");

    }

    public ActionForward modify(ActionMapping mapping, ActionForm form,

    HttpServletRequest request, HttpServletResponse response) throws Exception {

    // TODO Auto-generated method stub

    //return mapping.findForward("modify_success");

    return mapping.findForward("success");

    }

     

    }

    jsp页面的请求处理

    使用dispatchAction可以减少action 配置量(模式匹配)

        USER添加

        USER删除

         USER修改

     

     

     

     

     

    struts模式匹配

         

       

       

         

     

     

     

    使用dispatchAction可以减少action 配置量(模式匹配)

        USER添加

        USER删除

         USER修改

    你可能感兴趣的:(Struts1.X学习笔记)