发表于: 2018-01-18 08:42:58

1 640


今天完成的事情:

1  tiles

模块化jsp文件

SSM项目中

                                             

 

1、在springMVC配置文件中,配置tiles的视图解析器

1.1

代码:

 

<!-- 配置tiles视图解析器,在tiles视图定义文件中定义的视图,交由本视图处理器处理 -->
 
<bean   id="tilesViewsResolver"   class="org.springframework.web.servlet.view.tiles3.TilesViewResolver">
     
<!-- order="1"表示优先级,数字越小,解析器的优先级越高 -->
     
<property name="order"   value="1"/>
      <property
name="viewClass"   value="org.springframework.web.servlet.view.tiles3.TilesView"/>
  </bean>
 
  <bean
id="tilesConfigurer"   class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">
      <property
name="definitions">
          <list>
              <value>
/WEB-INF/layout/study.xml</value>
              <value>
/WEB-INF/layout/task4.xml</value>
          </list>
      </property>
  </bean>

1.2

解释

首先一个bean配置了视图解析器

然后另一个bean指定了一个tiles 视图定义文件:   /WEB-INF/layout.xml

在这个视图定义文件中,定义的视图了需要用tiles视图解析器来解析的视图

3、新建布局文件

task4\src\main\webapp\WEB-INF\layout\studyLayout.jsp

3.1代码

<%--
     
本文件是布局文件,说明网页长什么样,相当于html的骨架结构
     
具体内容怎么填充在 布局定义
xml文件 中
  --%>
  <%-- pageEncoding="utf-8" --%>
 
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
  <%@
taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
 
<%-- tiles --%>
 
<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
  <%@
taglib uri="http://tiles.apache.org/tags-tiles-extras" prefix="tilesx" %>
 
<html>
  <head>
      
<tiles:insertAttribute name="headCommon" ignore="true" />
     
<title>实验</title>
  </head>
  <body>
      <div>
         
<tiles:insertAttribute name="foot" ignore="true" />
     
</div>
  </body>
  </html>

3.2解释

把这第3步放在2前边是让人更容易理解。

布局文件的意思就是:

很多类似网页结构的抽取,重复地方重用,得到一个布局。

描述网页长成什么样,但是网页的内容不在这里。

向布局文件中插入内容,要有两个文件:内容文件(jsp文件),和视图定义文件

有这样一句  <tiles:insertAttribute   name="headCommon" />   代表在这个studyLayout.jsp 布局文件中可以插入内容,插入内容时的变量名称就是 headCommon ignore="true"   作用见下面

4、创建内容文件:也就是向3中布局文件中插入的内容

4.1文件

4.2解释

文件中是抽取出的具体的内容

2、新建tiles 视图定义文件,定义每个视图的内容

并且这些视图交由tiles解析器来解析(在第一步配置的)

2.1
 
代码

<?xml version="1.0"   encoding="UTF-8" ?>
  <!DOCTYPE
tiles-definitions   PUBLIC
         
"-//Apache Software Foundation//DTD Tiles   Configuration 3.0//EN"
            "http://tiles.apache.org/dtds/tiles-config_3_0.dtd"
>
 
<!--==================== 理解   =====================-->
  <!--
     
首先要明白,这个文件中有很多 definition ,每个 definition 创建出来的东西
     
是 视图 ,这些 视图 交由
tiles 的视图解析器进行解析,   所以叫它 视图定义文件
 
-->
 
 
<tiles-definitions>
 
     
<!-- 一个视图定义,得到视图,名称为 name 的值,使用哪个布局可以用 template= 的值指定   -->
     
<definition name="studyLayout"   template="/WEB-INF/layout/studyLayout.jsp">
         
<!-- 上一句 template= 表示使用 studyLayout.jsp 这个布局文件,就先找到这个布局文件
         
布局文件中有这样一句
    <tiles:insertAttribute name="headCommon"   ignore="true"/> 代表
         
在这个
studyLayout.jsp 布局文件中可以插入内容,插入内容时的变量名称就是 headCommon
         
          ignore="true"
意思是在视图定义中如果没有插入,直接忽略而不报错,例如这个 studyLayout
         
视图定义就没有全部插入,用户如果请求studyLayout视图的话,解析时也不会报错
 
          put-attribute 
的意义就是向这个布局文件插入内容
          
具体来说,布局文件指定了 变量名称就是
headCommon,那么在本定义文件中,就可以把
          
另外一个含有具体内容的
jsp文件插入到 studyLayout.jsp 这个布局文件中。
 
          
例如下面这句就是把
/WEB-INF/views/headCommon.jsp 这个文件插入到   studyLayout.jsp
          
这个布局文件中,插入的地方,就是   headCommon 所在的地方 -->
         
<put-attribute name="headCommon"   value="/WEB-INF/views/headCommon.jsp" />
      </definition>
 
     
<!-- layout1 视图定义,extends表示从哪个布局继承   -->
     
<definition name="layout1"   extends="studyLayout">
          <put-attribute
name="headCommon"   value="/WEB-INF/views/headCommon.jsp" />
          <put-attribute
name="title"   value=""/>
          <put-attribute
name="body"   value=""/>
          <put-attribute
name="foot"   value="/WEB-INF/study/foot.jsp" />
      </definition>
 
     
<!-- layout2 视图定义,extends表示从哪个布局继承   -->
     
<definition name="layout2"   extends="studyLayout">
          <put-attribute
name="headCommon"   value="/WEB-INF/views/headCommon.jsp" />
         
<!-- 如果布局文件中没有 title属性,下面这一句,内容是放不进去的   -->
         
<put-attribute name="title"   value="/WEB-INF/study/title.jsp"/>
          <put-attribute
name="body"   value=""/>
          <put-attribute
name="foot"   value="/WEB-INF/study/foot.jsp" />
      </definition>
 
  </tiles-definitions>

5、编辑controller,把请求转给已经配置过的视图

注意:return的应该是视图的名称,不是jsp文件的名称

 

 

tiles的作用就是重复的内容复用。

 

2  自定义jsp标签

请参考fmt:format标签的写法:

1.jsp文件中引用自定义标签:

引入标签

<%@ taglib prefix="time" uri="/timeTag" %>

使用标签

<p class="text-present"><time:time value="${job.createAt }" /></p>

因为在jsp文件中使用标签时指定uri了,所以

2. web.xml指定uritld文件的对应关系:

3.创建这个tld文件

<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/javaee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
       http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
       version="2.1">

   <tlib-version>1.1</tlib-version>
   <!-- short-name  类比 c 标签的 "c" -->
   <short-name>dataTag</short-name>

   <!-- 这个uri不是必要的 -->

   <uri>http://bpzj.com/jsp/tags/data</uri>


   <tag>
       <!-- jsp中使用时标签的名称,相当于 <c:forEach > forEach -->
       <name>time</name>
       <!--  -->
       <tag-class>com.bpzj.task4.Tag.TimeTag</tag-class>
       <body-content>JSP</body-content>
       <attribute>
           <name>value</name>
           <!-- jsp中使用标签时,是否必须指定 值 -->
           <required>true</required>
           <rtexprvalue>true</rtexprvalue>
       </attribute>
       <attribute>
           <name>pattern</name>
           <required>false</required>
           <rtexprvalue>true</rtexprvalue>
       </attribute>
   </tag>

</taglib>


在这个tld文件中,指定了标签对应的 class

4.创建这个class,进行处理

 

package com.bpzj.task4.Tag;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspTag;
import javax.servlet.jsp.tagext.TagSupport;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class TimeTag extends TagSupport implements JspTag {

/**
    * jsp文件中,使用本标签时传入的值
    * 这里传入的是一个 long 类型的表示时间的值
    *
    * 参考 c:out 标签 <c:out value=""/> 假如,这里是
    * c:out value="${time}"/> 就会取出 ${time} 的值
    * 传给标签,也就是传给类的 setValue 方法,赋值
    */
   private String value;

   private String pattern;

   public void setPattern(String pattern) {
       this.pattern = pattern;
   }

   public void setValue(String value) {
       this.value= value;
   }


    // 应该是在 doEndTag 方法中转换时间,标准库的 <fmt:formatDate> 也是这样做的
   @Override
     public int doEndTag() throws JspException {


    // ***********************************************************************************
       // 入参判断,如果没有传入pattern,使用默认值
       String formatted = null;
       if (pattern != null) {
           formatted = pattern;
           } else { formatted = "yyyy-MM-dd HH:mm:ss";}


    // ***********************************************************************************
       // 使用Date模块获取时间,并格式化为字符串
       long time = Long.valueOf(value);
       Date date =new Date(time);
       SimpleDateFormat dateFormat = new SimpleDateFormat(formatted);
       String formattedTime = dateFormat.format(date);


       // ***********************************************************************************
       // 使用 Calendar 获取时间
       // long time = Long.valueOf(value);
       // Calendar calendar = Calendar.getInstance();
       // calendar.setTimeInMillis(time);
       // SimpleDateFormat dateFormat = new SimpleDateFormat(formatted);
       // 得到格式化的时间
       // String formattedTime = dateFormat.format(calendar.getTime());


       // ************************************************************************
       // 输出 字符串到jsp文件
       try {
        // 使用 pageContext.getOut().write jsp 文件写入内容
           pageContext.getOut().write(formattedTime);
       } catch (IOException e) {
              e.printStackTrace();
       }
        return super.doEndTag();
   }
}


3  深度思考:

1 什么是jsp

servlet中写过html的都知道有多痛苦。

jsp相当于在html形式的servlet,更加动态,最终还是要转译成servlet类,编译为class,交给web容器,封装成响应报文,发给请求端,请求端收到报文,用浏览器渲染出来

 

2 jsp有几个内置对象?

jsp内置对象:可以不加声明和创建就可以在JSP页面脚本(Java程序片和Java表达式)中使用的成员变量

jsp9大内置对象:

1).request对象

客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应。它是HttpServletRequest类的实例。

2).response对象

response对象包含了响应客户请求的有关信息,但在JSP中很少直接用到它。它是HttpServletResponse类的实例。

response对象具有页面作用域,即访问一个页面时,该页面内的response对象只能对这次访问有效,其它页面的response对象对当前页面无效。

3).session对象

session对象指的是客户端与服务器的一次会话,从客户端连到服务器的一个WebApplication开始,直到客户端与服务器断开连接为止。它是HttpSession类的实例。

Session对象是一个JSP内置对象,它在第一个JSP页面被装载时自动创建,完成会话期管理。从一个客户打开浏览器并连接到服务器开始,到客户关闭浏览器离开这个服务器结束,被称为一个会话。当一个客户访问一个服务器时,可能会在这个服务器的几个页面之间切换,服务器应当通过某种办法知道这是一个客户,就需要Session对象。

session对象具有会话作用域。

4).out对象

out对象是JspWriter类的实例,是向客户端输出内容常用的对象

5).page对象

page对象就是指向当前JSP页面本身,有点象类中的this指针,它是java.lang.Object类的实例

6).application对象

application对象实现了用户间数据的共享,可存放全局变量。它开始于服务器的启动,直到服务器的关闭,在此期间,此对象将一直存在;这样在用户的前后连接或不同用户之间的连接中,可以对此对象的同一属性进行操作;在任何地方对此对象属性的操作,都将影响到其他用户对此的访问。服务器的启动和关闭决定了application对象的生命。它是ServletContext类的实例。

 

7).exception对象

exception对象是一个例外对象,当一个页面在运行过程中发生了例外,就产生这个对象。如果一个JSP页面要应用此对象,就必须把isErrorPage设为true,否则无法编译。他实际上是java.lang.Throwable的对象

8).pageContext对象

pageContext对象提供了对JSP页面内所有的对象及名字空间的访问,也就是说他可以访问到本页所在的SESSION,也可以取本页面所在的application的某一属性值,他相当于页面中所有功能的集大成者,它的本类名也叫pageContext

9).config对象

config对象是在一个Servlet初始化时,JSP引擎向它传递信息用的,此信息包括Servlet初始化时所要用到的参数(通过属性名和属性值构成)以及服务器的有关信息(通过传递一个ServletContext对象)

另外四大作用域:

requestpagesessionapplication

一张表:

隐含对象

类型

作用域

request

javax.servlet.http.HttpServletRequest

request

response

javax.servlet.http.HttpServletResponse

page

pageContext

javax.servlet.jsp.PageContext

page

session

javax.servlet.http.HttpSession

session

application

javax.servlet.ServletContext

application

out

javax.servlet.jsp.JspWriter

page

config

javax.servlet.ServletConfig

page

page

java.lang.Object

page

exception

java.lang.Throwable

page

 

 

3 为什么要使用tiles框架?

 

答:页面复用,减少代码量,简化开发

 

明天计划的事情:

任务5

遇到的问题:

tiles复用时,页面乱码

在每个jsp文件头部指定编码格式

jsp标签,转换时间格式是在哪个方法?

看师兄的日报,用的都是doStartTag方法,感觉不太对,看了标准库的fmt:formatDate标签的源码,确实不是doStartTag方法,应该是在doEndTag方法。

收获:

tiles的用法,

jsp标签




没有使用tiles的页面:

http://120.79.47.191/task4/old10

http://120.79.47.191/task4/old11

使用tiles的页面:

http://120.79.47.191/task4/tiles10

http://120.79.47.191/task4/tiles11




返回列表 返回列表
评论

    分享到