发表于: 2018-02-26 23:11:00

1 531


今日完成:

1.       Tiles框架学习

作用:对页面分块复用

1)  maven中添加依赖

<!--tiles-->
<dependency>
    <groupId>
org.apache.tiles</groupId>
    <artifactId>
tiles-extras</artifactId>
    <version>
3.0.8</version>
</dependency>

2)  springmvc配置文件中为Tiles配置视图解析器

<bean id="tilesViewResolver" class="org.springframework.web.servlet.view.tiles3.TilesViewResolver" p:order="1"/>
<bean
id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">
    <property
name="definitions">
        <list>
            <value>
/WEB-INF/tiles/layout.xml</value>
        </list>
    </property>
</bean>

3)  添加Tiles布局文件layout.xml

                                             

<?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"
>
<tiles-definitions>
   
<!-- 主布局 -->
   
<definition name="layout" template="/WEB-INF/views/layout.jsp">
    </definition>
   
<!-- 主布局 -->
    <!--
项目 -->
   
<definition name="tiles_index" extends="layout">
       
<!--<put-attribute name="title" value="首页"/>-->
        <!--<put-attribute name="header" value="/WEB-INF/views/index_header.jsp" />-->
        <!--<put-attribute name="body" value="/WEB-INF/views/index_body.jsp" />-->
        <!--<put-attribute name="footer" value="/WEB-INF/views/index_footer.jsp" />-->
       
<put-list-attribute name="cssPathList">
            <add-attribute
value="/css/base.css"></add-attribute>
            <add-attribute
value="/css/main.css"></add-attribute>
        </put-list-attribute>
    </definition>
   
<!--项目-->
    <!--
项目 -->
   
<definition name="tiles_profession" extends="layout">
       
<!--<put-attribute name="title" value="职业"/>-->
        <!--<put-attribute name="header" value="/WEB-INF/views/profession_header.jsp" />-->
        <!--<put-attribute name="body" value="/WEB-INF/views/profession_body.jsp" />-->
        <!--<put-attribute name="footer" value="/WEB-INF/views/profession_footer.jsp" />-->
       
<put-list-attribute name="cssPathList">
            <add-attribute
value="/css/base11.css"></add-attribute>
            <add-attribute
value="/css/t11.css"></add-attribute>
        </put-list-attribute>
    </definition>
   
<!--项目-->
</tiles-definitions>

项目extends于主布局文件,主布局文件可以添加默认设置,项目中的配置可以对主布局文件的配置进行替换,Controller通过返回tiles_indextiles_profession分别进行访问

put-attribute使用不同jsp子页面对主布局页面进行构造

put-list-attribute引入css路径列表,在主页面中使用c:forEach引用(js类似)

4)  主页面layout.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@
taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles"%>
<%@
taglib prefix="tilesx" uri="http://tiles.apache.org/tags-tiles-extras" %>
<%@
taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <meta
charset="utf-8">
    <meta
http-equiv="X-UA-Compatible" content="IE=edge">
    <meta
name="viewport" content="width=device-width, initial-scale=1">
    <title>
<tiles:getAsString name="title"></tiles:getAsString></title>
    <link
href="/css/bootstrap.min.css" rel="stylesheet" type="text/css">
    <script
src="/js/jquery.min.js"></script>
    <script
src="/js/bootstrap.min.js"></script>
   
<tilesx:useAttribute name="cssPathList" ignore="true"></tilesx:useAttribute>
    <
c:forEach items="${cssPathList}" var="cssPath">
       
<link type="text/css" href="${cssPath}">
   
</c:forEach>
</head>
<body>
   
<tiles:insertAttribute name="header"></tiles:insertAttribute>
    <
tiles:insertAttribute name="body"></tiles:insertAttribute>
    <
tiles:insertAttribute name="footer"></tiles:insertAttribute>
</body>
</html>

引入通用cssjs文件和meta,也可以分别放置于不同jsp页面进行引用

tiles:getAsString引入title

tilesx:useAttribute引入布局文件layout.xmlcss列表,通过c:forEach引用

tiles:insertAttribute引入子页面

5)  子页面设置

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

直接切分页面

ps页面需要的taglib必须单独添加

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

2.       InternalResourceViewResolver解析器会自动添加前缀和后缀(之前没理解好)

<property name="prefix" value="/WEB-INF/views/"/>
<property
name="suffix" value=".jsp"/>

order表示视图解析的优先级,数目越小优先级越大(即:0为优先级最高,所以优先进行处理视图)

对于解析器InternalResourceViewResolver来说,不管能不能解析它都不会返回null,也就是说它拦截了所有的逻辑视图,让后续的解析器得不到执行,所以InternalResourceViewResolver必须放在最后。

ps:不能解析就返回null,这样后续解析器才能解析。(如何返回null

如果为DispatcherServlet指定多个ViewResolver的话,不要给予InternalResour- ceViewResolver以及其他UrlBasedViewResolver子类过高的优先级,因为这些ViewResolver即使找不到相应的视图,也不会返回null以给我们轮询下一个ViewResolver的机会,这样,我们所指定的其他ViewResolver实际上就形同虚设。合理的处理方式是,给予ResourceBundleView- Resolver或者XmlViewResolver这种能够通过返回null以表明无法找到相应视图的ViewResolver较高的优先级,而只是将InternalResourceViewResolver(或者其他类似行为的ViewResolver)添加为最低优先级ViewResolver,以作为DispatcherServlet的后备查找对象。

3.       <%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%>

charset=GB18030指的是此jsp处理完后输出到浏览器的内容的编码方式为GB18030pageEncoding="GB18030"设置的是jsp文件本身的编码,jsp文件会被编译成java文件(每个jsp页面在tomcat下的work目录中,都会有与之对应的java文件和class文件),然后再继续进行下一步工作。这里的pageEncoding属性,就是设置从jsp文件到java文件的编码方式。

设置成一致的

4.       EL表达式自动匹配jsp页面

layout.xml

<put-attribute name="item" expression="/${item}.jsp" />

    layout.jsp

<tiles:insertAttribute name="item" />

Controller

model.addAttribute("item","introduction");

ps:模板jsp页面中引用的页面如果不存在就直接ignore

5.       serialVersionUID

serialVersionUID表示:“串行化版本统一标识符”(serial version universal identifier),简称UID

serialVersionUID必须定义成下面这种形式:static final long serialVersionUID = xxxL;

serialVersionUID 用来表明类的不同版本间的兼容性。有两种生成方式: 一个是默认的1L;另一种是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段

当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。 Java对象转换为字节序列的过程称为对象的序列化,把字节序列恢复为Java对象的过程称为对象的反序列化。

  对象的序列化主要有两种用途:

  1 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;

2 在网络上传送对象的字节序列。

idea中设置自动生成serialVersionUID提示

6.       Long.valueOf(这里有参数),是将参数转换成long的包装类——Long

7.       Calendar

现在最为普及和通用的日历就是 "Gregorian Calendar"。也就是我们在讲述年份时常用 "公元几几年"Calendar 抽象类定义了足够的方法,让我们能够表述日历的规则。

Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEARMONTHDAY_OF_MONTHHOUR 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间 1970 1 1 日的 00:00:00.000,格里高利历)的偏移量

 

Calendar calendar = Calendar.getInstance();  //使用默认时区和语言环境获得一个日历。

 

8.       getTIme()方法是把一个date对象转成毫秒;parse方法是把一个时间格式的字符串转换成毫秒。

9.       pageContext对象是JSP中很重要的一个内置对象,不过在一般的JSP程序中,很少用到它。它是javax.servlet.jsp.PageContext类的实例对象,可以使用PageContext类的方法。实际上,pageContext对象提供了对JSP页面所有的对象及命名空间的访问。

JspWriter getOut( ) 回传网页的输出流,例如:out

10.   自定义tag标签,将long类型转化为指定日期格式(程序员可以自定一些特定功能的标记, 用来封装代码, 达到分工, 重用性等多种好处.https://www.cnblogs.com/Maple-leaves/articles/4471043.html

1)  创建处理标签的Java

继承自TagSupport类,重写doStartTag方法,处理传入的long类型时间转换为制定date格式

doStartTag是在扫描到起始标签时调用,doEndTag是在扫描到结束标签是调用。

value为传入的参数,写一个set方法,controller类通过modeandviwelong类型时间传给jsp页面,jsp页面中,在自定义标签中使用value=”EL表达式将时间传给该java类。

public class DateTag extends TagSupport{

   
private static final long serialVersionUID = -818658804117151461L;

    private
String value;

   
@Override
   
public int doStartTag() throws JspException{
        String vv =
"" + value;
        try
{
           
long time = Long.valueOf(vv.trim());
           
Calendar c = Calendar.getInstance();
           
c.setTimeInMillis(time);
           
SimpleDateFormat dateFormat = new SimpleDateFormat("yyy-MM-dd HH:mm:ss");
           
String s = dateFormat.format(c.getTime());
           
pageContext.getOut().write(s);
       
} catch (Exception e){
            e.printStackTrace()
;
       
}
       
return super.doStartTag();
   
}

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

2)  创建标签库(http://www.jb51.net/article/87581.htm

标签库定义文件的根元素是taglib,它可以包含多个tag子元素,每个tag子元素都定义一个标签。

<?xml version="1.0" encoding= "UTF-8"?>
<taglib>
   
<!--此标签库的版本-->
   
<tlib-version>1.0</tlib-version>
   
<!--此标签库依赖的JSP版本-->
   
<jsp-version>2.0</jsp-version>

    <short-name>
date</short-name>
   
<!-- 定义第一个标签 -->
   
<tag>
       
<!-- 定义标签名 -->
       
<name>date</name>
       
<!-- 定义标签处理类 -->
       
<tag-class>org.wyq.task.datetag.DateTag</tag-class>
       
<!--标签的body中可以加入JSP程序代码-->
       
<body-content>JSP</body-content>
        <attribute>
           
<!--属性-->
           
<name>value</name>
           
<!-- 是否必須赋值 -->
           
<required>true</required>
           
><!-- 表示是否接受jsp语法或者el语言或其他动态语言,默认false -->
            
<rtexprvalue>true</rtexprvalue>
        </attribute>
    </tag>
</taglib>

3)  web.xml中申明自定义标签

<jsp-config>
    <taglib>
        <taglib-uri>
/tags</taglib-uri>
        <taglib-location>
/WEB-INF/tld/datetag.tld</taglib-location>
    </taglib>
</jsp-config>

taglib-urijsp页面taglib中引用的uri

taglib-location指定tld文件

ps:如果不在web.xml中进行声明,可以直接引用本地路径tld的地址

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@
taglib prefix="tag" uri="/WEB-INF/tld/datetag.tld" %>
<p>Tag处理时间<tag:date value="${datetag}"></tag:date></p>

 

4)  jsp页面中引用

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@
taglib prefix="tag" uri="/tags" %>
<p>Tag处理时间<tag:date value="${datetag}"></tag:date></p>

11.   服务器上WEB-INF为私有的,不能放置静态文件

明日计划:

1.       整理任务四

2.       开始学习任务五,DESTokenCookie,拦截器等于登陆有关的知识

遇到的问题:

1.       这句有什么作用,注释掉后,jsp页面依然正常,可以使用jstl标签

<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>

2.       String vv = "" + value;  为什么传入long类型使用String类型接收,””的作用是把long类型转换为string类型吗?

3.       return super.doStartTag(); 这个返回值不理解,去掉super就变成循环调用;

4.       tld文件中的uri标签和web.xml中的taglib-uri标签的区别

5.       没有配置日志文件报的问题,但是没有影响项目运行,而且项目中并没有使用日志

6.       使用了未经检查或者不安全的操作????这个该怎么查

收获:

1.       学习Tiles框架,对jsp页面进行分块复用

2.       自定义tag标签,在jsp页面中使用,可以避免大量java重复代码

3.       将带有cssjs和图片的项目部署到服务器



返回列表 返回列表
评论

    分享到