发表于: 2017-08-15 22:23:07
3 1160
今天做的事:
学习Tiles框架
先来一张大家都喜欢放的图。
然后我大致看了一下,其实就是一个页面复用,不过还没写具体代码,因为我被另外两个标签困住了
即<%include%>和<%jsp:include%>,不过放到后面说
继续说回Tiles标签
在springMVC中直接添加pom.xml依赖即可使用tile标签
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-extras</artifactId>
<version>3.0.5</version>
</dependency>
然后可以使用
<tiles:getAsString
<tiles:insert
<tiles:put
<tiles:useAttribute
等标签进行操作,但它们具体干什么暂时还未细致了解,明天应用一下
还有一个比较关键的标签用来定义布局
<tiles:definition
可以利用这个进行区域复用
然后还有很多标签,慢慢了解
反正对Tiles的初步印象就是页面复用,有点像小时候玩的拼装玩具,将复用的地方独立出来作为一个模板,然后把各页面不同的地方写出来没用的时候装到之前的模板里就行了。
然后讲一下今天困扰我的两个标签<%include%>和<%jsp:include%>
因为之前从来没有用过,然后今天看Tiles框架发现了这两个标签,顺手就学习了一波
首先
我们都知道在jsp中include有两种形式,分别是
<%@ include file=” ”%>
<jsp:include page=” ” flush=”true”/>
前者是指令元素、后者是行为元素。
这里我直接上结论,具体过程分析什么的在网上都有
主要有两个方面的不同;
一:执行时间上:
<%@ include file=“relativeURI”%> 是在翻译阶段执行
<jsp:include page=“relativeURI” flush=“true” /> 在请求处理阶段执行.
二:引入内容的不同:
<%@ include file=“relativeURI”%>引入静态文本(html,jsp),在JSP页面被转化成servlet之前和它融和到一起.
<jsp:include page=“relativeURI” flush=“true” />引入执行页面或servlet所生成的应答文本.
这里对翻译阶段进行一下说明:我们知道,jsp页面不能原封不动地被传送给浏览器,所有的jsp元素都必须首先由服务器进行处理。这是通过将jsp页面转达化成servlet,然后执行这个servlet来完成的。服务器需要一个jsp容器来处理jsp页面。jsp容器通常以servlet的形式来实现,这个servlet经过配置,可以处理对jsp页面的所有请求。
Jsp容器负责将jsp页面转化成servlet(称为jsp页面实现类?JSP Page implementation class),并编译这个servlet。这两步就构成了翻译阶段.
Jsp容器除了上面提到的负责将jsp页面转化成servlet外,还负责调用jsp页面实现类以处理每个请求并产生应答.这个阶段我们就称为请求处理阶段.请求处理阶段仅执行类文件)。
更简单的说:
include是将静态资源贴到请求的jsp页面中
jsp:include是两个jsp页面进行一个通信,而不是组合成一个文件
但是有一个问题:很多blog等都说
如果调用文件时用<%@ include file=” ”%>,那么必须将被调用页面中的<%@ page language=”java” contentType="text/html;charset=gb2312"%>去掉,否则会出错;
如果调用文件时用<jsp:include page=” ” flush=”true”/>,那么必须将被调用页面中的<%@ page language=”java” contentType="text/html;charset=gb2312"%>加上,否则会出错!
但是,我做测试时,是和这个说法不一致的
下面是我的测试代码
header.jsp
<%@page language="java" contentType="text/html;charset=gb2312"%>
<h2 style="font-family:arial;color:red;font-size:25px;text-align:center">
静态包含的标题(jsp)
</h2>
header.html
(注意,如果动态jsp页面调用HTML文件时,一定要在头部加上编码转换,否则会报乱码,但如果单独访问HTML,头部的部分是直接打印在网页上的,而且<head>头中的那部分并没有起作用,只有它还是会有乱码问题)
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<h2 style="font-family:arial;color:red;font-size:25px;text-align:center">
动态包含的标题(HTML)
</h2>
DynamicInclude.jsp
<%@page language="java" contentType="text/html;charset=gb2312"%>
<html>
<head>
<title>动态包含</title>
</head>
<body style="background-color:lightblue">
<%@include file="header.html"%>
<%@include file="header.jsp"%>
<jsp:include page="header.jsp" flush="true"/><!--动态包含-->
<%--<jsp:include page="header.html" flush="true"/><!--动态包含-->--%>
<table border="1" align="center">
<tr>
<td>姓名</td><td>性别</td><td>年龄</td><td>爱好</td>
</tr>
<tr>
<td>a</td><td>b</td><td>c</td><td>d</td>
</tr>
</table>
</body>
</html>
被注释这句是运行不了的,如果运行会出现如下状况
首先正常情况下(如上代码)
如果将注释取消
其后代码都未运行,且抛出错误
java.lang.IllegalStateException: Cannot forward after response has been committed
这是因为jsp:include无法加载HTML的静态资源,通过我们之前讲的工作方式就知道了,jsp:include是两个jsp页面的通信,自然无法加载静态资源
发现我上述代码中,文件头都有编码转换,而且没有报错,所以不知道是不是IDEA和eclipse有区别还是怎么的
如果我去掉各文件头的编码转换,那么网页上的中文全部都是乱码
所以这里正好讲一下编码转换的问题
关于JSP页面中的pageEncoding和contentType两种属性的区别:
pageEncoding是jsp文件本身的编码,contentType的charset是指服务器发送给客户端时的内容编码。
JSP要经过两次的“编码”,第一阶段会用pageEncoding,第二阶段会用utf-8,第三阶段就是在客户端浏览器里看到的网页, 用的是contentType。
第一阶段是jsp编译成.Java,它会根据pageEncoding的设定读取jsp,结果是由指定的编码方案翻译成统一的UTF-8 JAVA源码(即.java),如果pageEncoding设定错了,或没有设定,出来的就是中文乱码。
第二阶段是由JAVAC的JAVA源码至Java byteCode的编译,不论JSP编写时候用的是什么编码方案,经过这个阶段的结果全部是UTF-8的encoding的java源码。
第三阶段是Tomcat(或其的application Container)载入和执行阶段二的来的JAVA二进制码,输出的结果,也就是在客户端见到的,这时隐藏在阶段一和阶段二的参数contentType就发挥了功效而include指令就是在第一阶段之前执行的,注意这个是在第一阶段之前,所以,如果包含文件和被包含文件的文件编码不是utf-8,那么,该指令就会工作不太正常,不能正确的把被包含的文件从原来编码转换为包含文件的编码,就会出现乱码现象.
参考的文章链接:http://blog.csdn.net/Icing9520/article/details/8010434
然后还有一个问题就是今天我想通过springMVC直接访问HTML静态文件的,但是我发现我简单的配置了一些web.xml的一些东西,竟然无法访问.html文件,可是.jsp文件就没问题
后来查了一下,也没搞明白,就问了一下纪林师兄,然后又对SpringMVC的配置多了一点了解
我的web.xml文件的配置是这样的
<?xml version="1.0" encoding="UTF-8"?>
<web-app metadata-complete="true" version="3.1"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
<display-name>Archetype Created Web Application</display-name>
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>*.html</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
一个过滤器encodingFilter,一个servlet拦截器DispatcherServlet,而且拦截的所有请求
开始时的spring-servlet.xml文件是这样的
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<context:component-scan base-package="com.Tiles"/>
<!--前后缀拼接-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix">
<value>/WEB-INF/jsp/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
</bean>
</beans>
但是其实我没用到Controller,所以context标签可以不用写的
这里主要是一个视图解析器
通过InternalResourceViewResolver进行文件的前后缀拼接,其实也是作用在Controller里的,也可以不用
然后目前的主要配置就是在web.xml配置文件中了
我明明使用DispatcherServlet拦截了所有的请求,为什么访问不到.html文件呢?
后来查了一下,发现
我需要加入一个标签
<!--如果发现是静态资源的请求,就将该请求转由Web应用服务器默认的Servlet处理,如果不是静态资源的请求,才由DispatcherServlet继续处理。-->
<mvc:default-servlet-handler/>
就如同注解上说的那样
当我使用DispatcherServlet处理所有请求时,其实只能对相应的jsp动态资源进行拦截,而静态资源都被过滤了,自然访问不到,这时加入了上述mvn标签,就优先将静态资源转走,剩下的jsp动态资源交由DispatcherServlet处理。
至此,静态资源的访问也就得到了解决,加深了SpringMVC的理解。
最后再讲一下今天从师弟那里学到的一个新的java对象
StringBuilder
一个对象,可进行增删,对字符串等进行操作
比如加了一个字符,还是一个对象
有.append()和.insert()方法
.append()相当于String的“+”操作
但是有自己的缓冲区,不用每次new一个新对象,速度快,性能好
.insert()有双参数,可使用位置信息进行插入操作
StringBuilder.insert(int offset, char c)
另外还有一个StringBuffer,暂时未做了解,而且不建议使用!
明天计划:继续学习Tiles框架,实现Tiles框架
问题:都已解决
收获:上面的那些分享。
进度:开始时间:2017.08.12
预计demo:2017.08.17
是否有延期风险:不清楚。。好像Tiles框架的内容需要花点时间
禅道链接:http://task.ptteng.com/zentao/project-task-285-unclosed.html
评论