发表于: 2020-06-29 10:41:03
1 1787
今天完成的事情:结束任务四。学习Tag自定义标签,深度思考。
明天计划的事情:做任务五。
遇到的问题:师兄在真实项目中Velocity,Freemark,jsp用的哪个模板多些啊?
收获:
jsp中获取客户端数据和获取服务器返回数据方式
1. request对象通常用来接收客户端提交到服务端的数据,可以用request.getParameter()的方法获取参数内容。通常获取的都是URL提交的参数,或者POST提交的表单数据。
2. requestScope通常是获取request.setAttribute()方法把数据放到request对象中供客户端获取,然后客户端获取的方法就是requestScope.getAttribute()。获取的是个服务器返回的对象。
3. ${param.name} 等价于 request.getParamter("name"),这两种方法一般用于服务器从页面或者客户端获取的内容,这些内容都是String的。
4. ${requestScope.name} 等价于 request.getAttribute("name"),一般是从服务器传递结果到页面,在页面中取出服务器端保存的值。
自定义Tag
首先要知道的是应用自定义时间格式的原因,是因为数据库存储的bigint数据,entity实体类存放的是Long类型的时间数据,要输出到jsp页面要用到jstl中只有fmt:formatDate进行转为Date数据,但是jstl只能把String类型的转化,对于Long类型束手无策。原因就是这样。
1.先建一个类DateTag继承TagSupport。TagSupport就是一个自定义标签的类。当然还可以继承BodyTagSupport和SimpleTagSupport 。
DateTag类
public class DateTag extends TagSupport {
//默认日期格式
public static final String DEFAULT_FORMAT = "yyyy-MM-dd HH:mm:ss";
//long型的时间戳
private String value;
//日期格式,如果不传入则为默认
private String format;
//set方法赋值
public void setValue(String value) {
this.value = value;
}
public void setFormat(String format) {
this.format = format;
}
//重写doStartTag方法
@Override
public int doStartTag() throws JspException {
long l =0L;
//isNotBlank 判断某字符串 是否不为空且 长度不为0 且不由空白符(whitespace)构成
//isNotEmpty 判断某字符串是否非空
if(StringUtils.isNotBlank(value)){
l =Long.parseLong(value);
}
if (StringUtils.isNotBlank(format)){
format = DEFAULT_FORMAT;
}
//调用用于转换的getFormatData方法,并返回
String targetTime = "";
if(l > 0L){
targetTime = getFormatData(l,format);
}
try {
super.pageContext.getOut().write(targetTime);
} catch (IOException e) {
e.printStackTrace();
}
return super.doStartTag();
}
/**
* long类型数据转换为时间格式字符串
* @param l
* @param format
* @return
*/
public static String getFormatData(long l,String format){
Date d = new Date(l);
String date = new SimpleDateFormat(format).format(d);
return date;
}
}
2.编写tld文件,在WEB-INF下创建tags.tld文件
<?xml version="1.0" encoding="ISO-8859-1"?>
<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.0</tlib-version>
<short-name>mydate</short-name>
<uri>http://mydate.com</uri>
<!-- Invoke 'Generate' action to add tags or functions -->
<tag>
<!--description描述信息,name待会要引用的名字,tag-class自定义的类路径-->
<description>时间戳转换日期</description>
<name>myformatDate</name>
<tag-class>com.hyx.util.DateTag</tag-class>
<body-content>JSP</body-content>
<attribute>
<description>时间戳</description>
<name>value</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<description>需要输出的日期格式,默认为yyyy-MM-dd HH:mm:ss</description>
<name>format</name>
<required>false</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
</tag>
</taglib>
3.jsp引用
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="mydate" uri="http://mydate.com" %>
<html>
<body>
<h2>Hello World!</h2>
设置的默认时间是<mydate:myformatDate value="${1593408600145}" format="yyyy-MM-dd HH:mm:ss"/>
</body>
</html>
深度思考
1.JSP是什么?JSP中可否直接连接数据库?为什么现在不推荐使用%%来写JSP的代码,而是使用C标签?
JSP即java服务器页面,是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头以%>结束。JSP是一种Java servlet,主要用于实现Java web应用程序的用户界面部分。JSP标签有多种功能,比如访问数据库、记录用户选择信息、访问JavaBeans组件等,还可以在不同的网页中传递控制信息和共享信息。
使用%%太繁琐了,不如C标签简洁,并且能够分割java代码和页面显示的代码。
2.Html有哪些常用的标签,CSS有几种引用方式,JS应该在顶部还是应该在底部加载?
常用标签:<head><div><h><p><br><a href=""><link><font><img><li><ol>
CSS引用:
内联式<p style="color:red"></p>,用style属性。
嵌入式<style>这里直接写样式</style>就是把style当作标签使用值,在中间写样式。
外部式-写在<head>头部标签内,用<link rel="" href="" type="">
js在底部加载。顶部也可以放<script>引入。
3.SEO是什么,后端在用JSP的方式输出页面时,可以做的SEO优化有哪些?
SEO(搜索引擎优化),利用搜索引擎的规则提高网站在有关搜索引擎内的自然排名。
JSP是动态的网页抓取率很低,可以做成伪静态的。
JSP静态化。JSP技术主要用于动态网页, 但每次的结果没有保存, 导致每次请求都需要进行编译等多次复杂的操作, 这样使得系统开销巨大。在访问JSP网页时, 服务器会先把JSP转换成Servlet对象, 然后对Servlet进行处理, 最终将结果以HTML文件格式返回给浏览器。JSP静态化实际上就是在Servlet处理之后到HTML页面响应之前这一过程中, 设置一个拦截器, 将Servlet生成的HTML文件进行保存, 当下一次访问时, 可以直接加载HTML文件, 从而减少系统操作时间。
4.Tiles现在的版本是多少?Template,Attribute,Definition,ViewPreparer分别是什么?
现在是Tiles3.0.8
Template:模板。一个模板(Template)可以没有属性(attributes),这时候该模板能直接使用。
Attribute:属性。有三个值
- string:属性是string的话,会将string直接呈现在页面。
- template:属性是一个模板(Template),有无属性都行。如果有属性的话,你也要将他们填充后再呈现页面。
- definition:它是一个可重复使用组成的页面,包含所有的属性来填充以呈现页面。
Definition:定义。定义是呈现给最终用户的组合物;一个定义是由一个模板和属性组成的。
ViewPreparer:视图助手。有时候一个定义在呈现之前需要“预处理”。例如,显示一个menu时,menu的结构必须被创建并且已经保存在request范围内,视图助手将在呈现定义之前被调用,已达到预处理效果。
5.Tiles有什么用处,为什么要用Tiles,如果不使用Tiles,可以实现公共部分的复用吗?
简化代码,减少代码重复率,可以重用相同的页面部分。include标签也可以实现页面的复用。
6.套页面的前后端协作方式中,怎么传递参数给前端JS?怎么控制页面之间的跳转?
把参数放在Model中,通过Http的request内置对象可以获取到。控制页面跳转在Tiles定义中定义要跳转的页面,还可设置拦截器,放行和拦截哪些页面。
7.Velocity,Freemark是什么,和JSP的区别在哪里?推荐使用哪种模板语言?
Velocity:是Apache下基于java的模板引擎。其提供了一个Context容器,在java代码里面我们可以往容器中存值,然后在vm文件中使用特定的语法获取,这是velocity基本的用法,相对于jsp而言,velocity对前后端的分离更加彻底:在vm文件中不允许出现java代码,而jsp文件中却可以.
FreeMarker:是一款模板引擎:即基于模板和数据源生成输出文本(html网页,配置文件,电子邮件,源代码)的通用工具。它是一个 java 类库,最初用来在MVC模式的Web开发框架中生成HTML页面,它没有被绑定到Servlet或HTML或任意Web相关的东西上。也可以用于非Web应用环境中。FreeMarker 基于数据模型和模板来渲染,将业务逻辑和表现层分离。 JSP开发中,页面会有大量业务逻辑,不利于维护和阅读,使用FreeMarker可以避免这一问题。并且生成的是静态页面,对SEO友好,提高了访问速度和适合高并发量。
https://blog.csdn.net/DreamWeaver_zhou/article/details/78747813
至于用哪个要我自己都用过才能体会,都各自有优缺点,目前用的是jsp。
8.EL表达式是什么?常用的EL表达式有哪些?
1.EL(Expression Language)表达式语言,用于简化JSP的输出,基本语法${表达式}
2.EL表达式内置四种作用域对象从小到大pageScope(从当前页面取值),requestScope(从当前请求中取值),sessionScope(从当前会话中取值),applicationScope(从当前应用获取全局属性值)
3.${}中可以进行相应的运算。${emp.salary+300},${1<=3&&2>4}
4.EL内置param对象来简化参数的输出,${param.参数名}
9.C标签又是什么?怎么写一个自定义的标签?自定义的标签通常有什么用处?
C标签就是JSTL标签库,封装了jsp的通用核心功能。自定义标签在上面。
好处:简化jsp页面,提高代码的复用性;简洁可重用。
10.套页面和前后端分离的方式有什么区别,应该在哪种情况下选用哪种解决方式?
前后端分离是现在流行的方式,降低前后端的耦合度,套页面前后端耦合度较高,数据和页面比较糅合。如果是小项目并且访问量不大的开发,可以用套页面,对于中大项目,高并发的项目肯定是需要前后端的分离。
评论