服务端技术|jsp技术

1. 为什么要学习JSP

1.1.使用一个servlet往里面拼接原生html标签

Servlet往浏览器写数据,客户端输出是原样输出

1
2
3
4
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter writer = response.getWriter();
writer.write("哈哈哈哈哈");

那么既然原样输出,请问,如果我想要让文字加粗显示,怎么办呢?

【开发总结】:使用一个servlet实现一个网站效果,代码太繁琐了!!生不如死!!

简单案例:

从数据库取出数据,用jsp显示到页面中

Servlet代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String sql = "select * from user";
//发送查询语句
ResultSet rs = JDBCUtils.executeQuery(sql, null);
List<User> list = new ArrayList<>();
try {
while(rs.next()) {
String id = rs.getString("id");
String username=rs.getString("name");
//将获取到的数据放到对象中
User user = new User(id, username);
//将对象放到集合中
list.add(user);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 将集合放到request域中
request.setAttribute("list", list);
request.getRequestDispatcher("Myjsp2.jsp").forward(request, response);

}

Jsp代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<%@page import="org.apache.jasper.tagplugins.jstl.core.ForEach"%>
<%@page import="java.util.ArrayList"%>
<%@page import="cn.yueqian.jsp.User"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>


<%

List<User> list = (ArrayList<User>)request.getAttribute("list");
for(int i=0;i<list.size();i++){
out.write(list.get(i).getId()+"&nbsp;&nbsp;&nbsp;&nbsp;"+list.get(i).getUsername()+"&nbsp;&nbsp;&nbsp;&nbsp;");
}


%>

</body>
</html>

1.2.画图分析

2.JSP技术概述

JSP

JSP全名为Java Server Pages,中文名叫java服务器页面,其根本是一个简化的Servlet设计,它 [1] 是由[Sun Microsystems**](https://baike.baidu.com/item/Sun Microsystems)公司倡导、许多公司参与一起建立的一种动态网页技术标准。JSP技术有点类似ASP技术,它是在传统的网页HTML(标准通用标记语言的子集)文件(*.htm,*.html)中插入Java**程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件,后缀名为(*.jsp)。 用JSP开发的Web应用是跨平台的,既能在Linux下运行,也能在其他操作系统上运行。

它实现了Html语法中的java扩展(以 <%, %>形式)。JSP与Servlet一样,是在服务器端执行的。通常返回给客户端的就是一个HTML文本,因此客户端只要有浏览器就能浏览。

JSP技术使用Java编程语言编写类XML的tags和scriptlets,来封装产生动态网页的处理逻辑。网页还能通过tags和scriptlets访问存在于服务端的资源的应用逻辑。JSP将网页逻辑与网页设计的显示分离,支持可重用的基于组件的设计,使基于Web的应用程序的开发变得迅速和容易。 JSP(JavaServer Pages)是一种动态页面技术,它的主要目的是将表示逻辑从Servlet中分离出来。

Java Servlet是JSP的技术基础,而且大型的Web应用程序的开发需要Java Servlet和JSP配合才能完成。JSP具备了Java技术的简单易用,完全的面向对象,具有平台无关性且安全可靠,主要面向因特网的所有特点。

Jsp简单的说:html+java代码!

3.JSP入门

3.1.使用Escplise新建一个jsp模板

新建一个模板之后,仔细观察,jsp页面中的东东和传统的html中的东东区别!

Html模板结构:

1
2
3
4
5
6
7
8
9
10
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

</body>
</html>

Jsp模板结构:

1
2
3
4
5
6
7
8
9
10
11
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
</body>
</html>

经过观察:除了jsp中的第一行代码,没有见过,其他都见过,那么所以在jsp中写东西,你可以就像在html中写东西一样!!

1
2
3
4
5
6
7
8
9
10
11
12
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<h1 style="color: red;font-size: 100px">im here!!!!!</h1>
</body>
</html>

既然,在jsp写东西和html差不多一样,那为何需要这玩意呢?

3.2. jsp脚本和注释

3.2.1.jsp脚本:

1.<% java代码%>

2.<%=java变量或表达式%>、

3.<%!Java代码%>

Servlet是java类

Jsp就是一个Servlet +html

3.2.2.jsp注释

Html注释:

java注释://单行注释 /多行注释/

jsp注释:<%–注释内容–%>

4.JSP原理(本质)

4.1.原理概述

当我们在浏览器输入一个jsp对应的url地址,可以正常访问这个jsp页面,它到底内部做了哪些事情呢?

**1)**Tomcat目录:

2)Tomcat目录下的work目录:

3)再仔细对比文件名的变化:

【开发小结】:JSP的本质(真身)其实就是一个servlet程序而已!!

4.2.jsp三种脚本区别

<%
int a = 10;//局部变量

%>

<%=a %>

<%= 10+100 %>

<%!
int b = 100;//成员变量
int c = 2000;
public void test(){
int b = 120;
System.out.println(b);
}
%>
<%=b%>

4.3.jsp三种注释区别

Html注释:

—可见范围 jsp源码、翻译后的servlet、页面显示html源码

java注释://单行注释 /*多行注释*/

–可见范围 jsp源码 翻译后的servlet

jsp注释:<%–注释内容–%>

—– 可见范围 jsp源码可见

jsp注释: 不同的注释可见范围是不同

【开发小结】:jsp的注释,是最安全的!给Java程序员看!

4.4.jsp原理深入

jsp在第一次被访问时会被Web容器翻译成servlet,在执行

过程:

第一次访问—->helloServlet.jsp—->helloServlet_jsp.java—-> helloServlet_jsp.class 然后再去运行!!

PS:被翻译后的servlet在Tomcat的work目录中可以找到

第一次访问:准确的将,看你项目中jsp文件和work中翻译后信息是否一致,如果一致,以后就不再翻译了,如果不一致,那么就需要重新翻译!

5.JSP指令

jsp的指令是指导jsp翻译和运行的命令,jsp包括三大指令:

page指令 — 属性最多的指令(实际开发中page指令默认)

属性最多的一个指令,根据不同的属性,指导整个页面特性

格式:<%@ page 属性名1= “属性值1” 属性名2= “属性值2” …%>

Page指令常用属性如下:

language:jsp脚本中可以嵌入的语言种类

pageEncoding:当前jsp文件的本身编码—内部可以包含contentType

contentType:response.setContentType(text/html;charset=UTF-8)

session:是否jsp在翻译时自动创建session,默认自动创建

import:导入java的包

errorPage:当前页面出错后跳转到哪个页面

第二一种方式配置error页面 错误页面的访问顺序:errorPage>exception-type>error-code

isErrorPage:当前页面是一个处理错误的页面

extends:当前jsp需要继承那个父类

include指令

页面包含(静态包含)指令,可以将一个jsp页面包含到另一个jsp页面中

格式:<%@ include file=”被包含的文件地址”%>

【思考】:在开发中,include指令有什么作用呢?

案例:创建头和尾页面,在其他页面直接引用

taglib指令

在jsp页面中引入标签库(jstl标签库、struts2标签库)

格式:<%@ taglib uri=”标签库地址” prefix=”前缀”%>

引入标签库

使用标签库

1
2
<c:if></c:if> 
<a:xx></a:xx>

6.JSP 9大内置对象(隐式对象)(面试用)

6.1.隐式对象简介

jsp被翻译成servlet之后,service方法中有9个对象定义并初始化完毕,我们在jsp脚本中可以直接使用这9个对象

名称 类型 描述
out javax.servlet.jsp.JspWriter 用于页面输出
request javax.servlet.http.HttpServletRequest 得到用户请求信息,
response javax.servlet.http.HttpServletResponse 服务器向客户端的回应信息
config javax.servlet.ServletConfig 服务器配置,可以取得初始化参数
session javax.servlet.http.HttpSession 用来保存用户的信息
application javax.servlet.ServletContext 所有用户的共享信息
page java.lang.Object 指当前页面转换后的Servlet类的实例
*pageContext* javax.servlet.jsp.PageContext JSP的页面容器
exception java.lang.Throwable 表示JSP页面所发生的异常,在错误页中才起作用

思考:为何这些内置对象可以直接使用呢?我们从来没有去new,没有去创建过呀??

经过观察翻译之后的jsp源码中,一共有8个,那么还差一个是谁呢?

*Out对象*

下图就解释了为什么,顺序不一样,如果buffer属性设置为0kb,则顺序就一样了:

6.2PageContext

jsp页面的上下文对象,作用如下:

page对象与pageContext对象不是一回事

pageContext作用范围:就只在当前页面有效,默认的

1
2
<% *int\**** a = 10;%> 
<% System.out.print(a);%>

1)pageContext是一个域对象

setAttribute(String name,Object obj)

getAttribute(String name)

removeAttrbute(String name)

pageContext可以向指定的其他域中存取数据

setAttribute(String name,Object obj,int scope)

getAttribute(String name,int scope)

removeAttrbute(String name,int scope)

findAttribute(String name)**

pageContext可以指定往哪个域中存数据:

findAttribute(String name)

—依次从pageContext域,request域,session域,application域中获\ 取属性,在某个域中获取后将不在向后寻找

四大作用域的总结:

page域:默认当前jsp页面范围

request域:一次请求

session域:一次会话

application域:整个web应用

可以获取其它8大内置对象

例如: pageContext.getRequest() => request 对象

pageContext.getSession()

7. JSP标签(动作)

面试题,请简述静态引入,与动态引入的区别?

Include(静态引入),

<jsp:include >(动态引入)

1)页面包含(动态包含):<jsp:include page=”被包含的页面”/>

动态包含:会将两个页面都翻译出来

静态包含:直接将两个文件的代码拼凑在一起

让页面格式良好:

2)请求转发:<jsp:forward page=”要转发的资源” />

思考:

1.先思考转发的特点是什么?

2.servlet转发中实现步骤

1
2
3
 <!-- jsp:forward转发标签 -->
<jsp:forward page="/login.jsp">
</jsp:forward>

8.EL表达式技术(重要)

8.1.EL表达式概述

EL(Express Lanuage)表达式可以嵌入在jsp页面内部,减少jsp脚本的编写,EL出现的目的是要替代jsp页面中脚本的编写。

8.2. EL从域中取出数据(EL最重要的作用)

1)获得普通字符串

2)获得User对象的值

3获得List的值

EL最主要的作用:获得四大域中的数据,格式:${EL表达式}

EL获得pageContext域中的值:${pageScope.key};

EL获得request域中的值:${requestScope.key};

EL获得session域中的值:${sessionScope.key};

EL获得application域中的值:${applicationScope.key};

—同样是依次从pageContext域,request域,session域,application域中 获取属性,在某个域中获取后将不在向后寻找!

El 表达式11个内置对象

pageScope requestScope sessionScope applicationScope param paramValues

Header headerValues initParam cookie pageContext

获得当前项目的名字:

Cookie对象;

8.4.EL执行表达式

例如:

${1+1}

${empty user}

${user==null?true:false}

${1+1 }${1==1?*true*:*false* }${*empty* “” }${*empty* user }

9.JSTL标签库技术

9.1.JSTL概述

JSTL(JSP Standard Tag Library),JSP标准标签库,可以嵌入在jsp页面中使用标签的形式完成业务逻辑等功能。jstl出现的目的同el一样也是要代替jsp页面中的脚本代码。JSTL标准标准标签库有5个子库,但随着发展,目前常使用的是他的核心库

标签库 标签库的URI 前缀
Core http://java.sun.com/jsp/jstl/core c
I18N http://java.sun.com/jsp/jstl/fmt fmt
SQL http://java.sun.com/jsp/jstl/sql sql
XML http://java.sun.com/jsp/jstl/xml x
Functions http://java.sun.com/jsp/jstl/functions fn

9.2.JSTL下载和导入

JSTL下载:

从Apache的网站下载JSTL的JAR包。进入 “http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/”网址下载 JSTL的安装包。

jakarta-taglibs-standard-1.1.2.zip,然后将下载好的JSTL安装包 进行解压,此时,在lib目录下可以看到两个JAR文件,分别为jstl.jar和standard.jar。

​ 其中,jstl.jar文件包含JSTL规范中定义的接口和相关类,standard.jar文件包含用于 实现JSTL的.class文件以及JSTL中5个标签库描述符文件(TLD)

将两个jar包导入我们工程的lib中

使用jsp的taglib指令导入核心标签库

9.3.JSTL核心库常用标签

1)<c:if test=””>标签

其中test是返回boolean的条件

Jstl表达式结合el表达式一起使用

2)<c:forEach>标签

使用方式有两种组合形式:

参数:

items:集合

var:集合中的每个元素

begin:开始遍历位置

end:结束遍历的位置

varStatus=”status”:状态

status.count:可以得到循环的次数

示例:

1)遍历List的值

1
2
3
4
5
6
<c:forEach items="${list }" var="li" varStatus="status">
${li}
<c:if test="${status.count%2==0 }">
<br>
</c:if>
</c:forEach>

2)遍历List的值

1
2
3
4
5
6
7
<!--status:表示当前集合的状态码,count为循环一个计算器  -->
<c:forEach items="${list }" var="li" varStatus="status">
${li}
<c:if test="${status.count%2==0 }">
<br>
</c:if>
</c:forEach>

3)遍历Map<String,String>的值

1
2
3
4
5
6
<c:forEach items="${map}" var="map">
${map.key }
${map.value.username }


</c:forEach>

遍历Map<User,Map<String,User>>的值

entry.key—–User

entry.value——List<String,User>

案例:完成商品信息显示,循环显示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package cn.yueqian.spdemo;

import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import cn.yueqian.util.JDBCUtils;

/**
* Servlet implementation class SpServlet
*/
@WebServlet("/SpServlet")
public class SpServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

// 处理中文乱码
request.setCharacterEncoding("utf-8");
response.setContentType("text/html; charset=utf-8");
String sql = "select * from sp";
ResultSet rs = JDBCUtils.executeQuery(sql, null);

List<SP> list = new ArrayList<>();
if(null!=rs) {
try {
while(rs.next()) {
SP sp = new SP(rs.getInt("id"), rs.getString("sp_name"), rs.getString("sp_price"), rs.getString("img"));
list.add(sp);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
JDBCUtils.close(JDBCUtils.getCt(),JDBCUtils.getPs(), rs);
}
}
list.forEach(li->System.out.println(li));
request.setAttribute("list", list);
request.getRequestDispatcher("sp_show.jsp").forward(request, response);


}

protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}

}

Jsp代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

<table>
<tr>
<c:forEach items="${list}" var="li" varStatus="status">
<td>
<div>
<img src="${pageContext.request.contextPath }/img/${li.img }"
alt="图片飞了" style="width: 100px">
<p>${li.sp_name }</p>
<p style="color: red;">${li.sp_price }</p>
</div>
</td>
<c:if test="${status.count%4==0 }">
<tr>
</c:if>

</c:forEach>
</tr>
</table>

</body>
</html>

javaBean

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package cn.yueqian.spdemo;

public class SP {
private int id;
private String sp_name;
private String sp_price;
private String img;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getSp_name() {
return sp_name;
}
public void setSp_name(String sp_name) {
this.sp_name = sp_name;
}
public String getSp_price() {
return sp_price;
}
public void setSp_price(String sp_price) {
this.sp_price = sp_price;
}
public String getImg() {
return img;
}
public void setImg(String img) {
this.img = img;
}
@Override
public String toString() {
return "SP [id=" + id + ", sp_name=" + sp_name + ", sp_price=" + sp_price + ", img=" + img + "]";
}
public SP(int id, String sp_name, String sp_price, String img) {
super();
this.id = id;
this.sp_name = sp_name;
this.sp_price = sp_price;
this.img = img;
}
public SP() {
super();
}



}

效果图: