发表于: 2018-01-18 08:42:58
1 640
今天完成的事情:
1 tiles
模块化jsp文件
在SSM项目中
1、在springMVC配置文件中,配置tiles的视图解析器 | ||||
1.1 代码:
| <!-- 配置tiles视图解析器,在tiles视图定义文件中定义的视图,交由本视图处理器处理 --> | |||
1.2 解释 | 首先一个bean配置了视图解析器 然后另一个bean指定了一个tiles的 视图定义文件: /WEB-INF/layout.xml 在这个视图定义文件中,定义的视图了需要用tiles视图解析器来解析的视图。 | |||
3、新建布局文件 task4\src\main\webapp\WEB-INF\layout\studyLayout.jsp | ||||
3.1代码 | <%-- | |||
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" ?> | |||
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中指定uri和tld文件的对应关系:
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对象)
另外四大作用域:
request、page、session、application
一张表:
隐含对象 | 类型 | 作用域 |
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
评论