一.Jsp简介
1.Jsp是什么
JSP ( Java Server Page)是Sun公司制定的一种服务器端动态页面技术的组件规范,JSP作为简化Servlet开发的一种技术,实质上最终依然要转变为Servlet才可能运行,只不过这个转变过程由Servlet容器来完成,Jsp是一个以jsp为后缀的文件
2.Jsp作用
将servlet用于表现页面的内容提取出来写在jsp中
以".jsp"为后缀的文件中既包含HTML静态标记用于表现页面
也包含特殊的代码,用于生成动态内容。
3.使用Jsp的原因
为弥补servlet的不足(即在servlet中为了表现页面效果,需要输出大量html的标签,这些标签在Servlet中表现为一个个的字符串,不利于开发和后期维护)。
4.Jsp页面中包含的内容及作用
HTML(CSS,javaScript脚本):
注释:html注释(写java代码可以运行)和Jsp注释(写java代码不运行,就当注释)
Java代码:为了进行一些动态操作,包括声明,脚本,表达式
指令:控制Jsp转译成Servlet时的格式
内置对象:任何Jsp最后都会翻译转化成servlet,servlet会将内置对象声明好,Jsp可以直接使用
5.在MyEclipse里面配置一个自定义的Jsp
先在一个Jsp里面写好模板并复制–右击WebRoot–New–Jsp(Basic Templates)–随便写一个File name–next–点击右下角蓝色的小字Jsp Template–点击左上角MyEclipse–File and Editors–Jsp–单击JSP Template–右上角New–Name命名为MyJSPTemplate–Context:jsp_new–pattern中把复制过来的模板粘贴进去–OK–Apply–OK–Name里面选择Name为MyJspTemplate–Finish
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<html>
<head>
<meta http-equiv="content-Type" content="text/html; charset=utf-8">
</head>
<body>
</body>
</html>
二.Jsp注释
1.<!--注释内容-->
:HTML注释,可出现在JSP页面中,注释内容中包含了一些会被执行的Java代码。
2.<%--注释内容--%>
:JSP注释,不允许注释内容有Java代码,写了Java代码也会被忽略,不会执行。
三.Jsp中的java代码
<%! %>
:JSP声明(方便输出)
翻译成Servlet中的成员内容,定义属性,方法,类。
<% %>
:JSP小脚本(完成相对较长的逻辑运算)
翻译成Servlet中service方法内部的内容定义变量
<%= %>
:JSP表达式(方便输出)
翻译成Servlet中service方法中out.print();
四.指令
指令在JSP页面中通常起到控制Jsp转译成Servlet时的格式。
基本语法为:<%@ 指令名 属性=值%>
常用指令:
page指令
导包(导多种包用逗号隔开):<%@ page import= "java.util.*
,java.sql.*
"%>
设置编码方式:<%@ page contentType= “text/html;charset=utf-8”%>
设置解码方式:<%@ page pageEncoding= "UTF-8 "%>
include指令(静态包含)
主要用于将其他页面(.html/.jsp)包含在另一个页面之中
<%@ include file= "header.html" %>
taglib指令
引入标签库
<%@ taglib uri=“标签的URI的路径” prefix=“标签的别名”%>
五.小练习
练习一
jsp中的java在jsp页面中以表格的形式输出20行Hello JSP
创建WebProject,在WebRoot下创建exe1.jsp,在浏览器访问时用http://localhost:8080/jsp/exe1.jsp
<html>
<head>
<meta http-equive="content-type" content="text/html;charset=utf-8">
</head>
<body>
<table style="color:red" border="1" cellspacing="0" cellpadding="0">
<%--声明--%>
<%!String name="hello jsp";%>
<%--小脚本--%>
<%
for(int i=0;i<20;i++){
%>
<%--表达式--%>
<tr><td><%=name%></td></tr>
<%
}
%>
</table>
</body>
</html>
练习二
连接数据库在jsp页面中使用jdbc连接数据库,以表格的形式展示员工列表
在WebRoot下创建exe2.jsp,在浏览器访问时用http://localhost:8080/jsp/exe2.jsp
<%@ page language="java" import="java.io.*,java.sql.*,java.util.*" pageEncoding="utf-8"%>
<html>
<head>
<meta http-equive="content-type" content="text/html;charset=utf-8">
</head>
<body>
<table style="color:red" border="1" cellpadding="0" cellspacing="0">
<tr><td>ID</td><td>姓名</td><td>薪水</td><td>年龄</td></tr>
<%
Class.forName("com.mysql.jdbc.Driver");
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/mybase1","root","root123");
PreparedStatement pstm=conn.prepareStatement("select * from emp");
ResultSet rs=pstm.executeQuery();
while(rs.next()){
int id=rs.getInt(1);
String name=rs.getString(2);
double salary=rs.getDouble(3);
int age=rs.getInt(4);
%>
<tr><td><%=id%></td><td><%=name%></td><td><%=salary%></td><td><%=age%></td></tr>
<%
}
%>
</table>
</body>
</html>
六.Jsp的内置对象/隐含对象
1.注意:
1.所有的Jsp最后都会被翻译成Servlet
2.out 对象不是Servlet里面response.getWriter获得的out输出流,虽然作用都是输出数据流,但是不是同一个对象,JSPWriter的out对象有println和writer方法。
3.一个项目/一个应用只有唯一的一个ServletContext对象
4.exception对象类型是Threadable,是最大异常的父类
5.session对象可以保存用户信息,在周期内跟踪用户会话
6. Jsp中的客户和应用的区别,客户共享,应用不共享
2.包含的四个对象域/作用域可以调用setAttribute()存储值,getAttribute()获取值
作用范围最小:pageContext对象,仅JSP当前页面有效
作用范围第二:request对象,在这次请求中有效
作用范围第三:session对象,代表整个会话中有效
作用范围最大: application对象,代表整个应用有效
3.为什么会有这九大内置对象
原因:任何一个Jsp最后都会翻译转化成servlet,servlet会将这九个内置对象都声明好
看原码,找到tomcat的work文件夹,里面有所有最后jsp转化成servlet的一些代码
1.声明会当做全局变量翻译成servlet
2.小脚本或者表达式会当做service里面的核心代码翻译过去
3.out对象会调用out.write()方法,输出内容
4.每个内置对象都会在转化成的servlet中声明,如图,response和request对象声明在service方法中:
七.转发
1.简介:
一个Web组件( Servlet/SP )将未完成的处理通过容器转交给另外一个Web组件继续完成(就是从一个Servlet跳到另一个Servlet里面),这个转交的过程叫做转发。
2.作用
通过转发来共享数据
3.特点
①.转发之后浏览器地址栏地址不会发生变化,而重定向的地址会发生变化
原因:转发的过程是发生在服务器内部的,浏览器并不知道.
区别:先在浏览器访问,重定向会带着状态码回到浏览器,让浏览器再次发送请求到另一个路径,而转发是在tomcat内部直接跳转到list.jsp中
②.转发的目的地必须是同一个应用内部的某个地址,决不能跳出应用.
原因:是在servlet容器内转发。
例:如果要转发到http://www.baidu.com就不可以
区别:重定向的新地址可以是任意地址,转发到的新地址必须是同一个应用内的某个地址
③.转发过程中涉及到的所有Web组件共享同一个request对象和response对象,数据的传递和共享就依赖request对象
区别:重定向中有两次请求对象,不共享数据;转发只产生一次请求,request对象在异常请求内有效,所以可共享数据。
④.在forward之后的其他语句还会继续执行,只要不报异常
补充:即跳转之后下面如果还有一些其他逻辑处理,只要没有异常产生,任然会被执行
4.常见情况:
Servlet负责获取数据,然后将数据转交给JSP进行展现。
5.转发代码:
request.getRequestDispatcher(String uri).forward(request,response);
6.绑定数据到request对象:
request.setAttribute(String name,Object obj);
request.getAttribute(String name,Object obj);(在一定作用域范围内还可取出,request在此次申请有效)
7.转发的路径:
转发必须是同一个应用内部的某个地址,不可以跳转到其他应用。
//不正确
RequestDispatcher dispatcher = request.getRequestDispatcher("http://www.baidu.com");
//正确,两个都可以通过http://localhost:8080/jsp/list.jsp
RequestDispatcher dispatcher = request.getRequestDispatcher("/list.jsp");
RequestDispatcher dispatcher = request.getRequestDispatcher("list.jsp");
重定向的绝对跳转
//正确路径,地址会跳转到http://localhost:8080/jsp/index.jsp
response.sendRedirect("index.jsp");
//错误,不能加/,否则会访问到tomcat的主页面,地址会变成http://localhost:8080/index.jsp
response.sendRedirect("/index.jsp");
8.补充转发和重定向的区别
1.重定向可以是任意新地址;转发的新地址必须是同一个应用内的某个地址。
2.请求次数不同,数据是否共享问题,重定向中有两次请求对象,不共享数据;转发只产生一次请求对象,且在web组件间可共享数据
3.地址栏地址是否改变,重定向后地址栏地址改变,而转发则不会
4.新地址的范围不同,重定向的新地址可以是任意地址,转发到的新地址必须是同一个应用内的某个地址。
9.小练习之练习三
在servlet中使用request绑定员工信息,转发到Jsp从request中取值展示员工信息
在jsp的web Project里面创建一个web包,创建一个ActionServlet.java的Servlet文件
package web;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class AS extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
//使用request绑定参数
//转发过程中就可以将request绑定的参数同时转发到list.jsp中,因为转发是可以共享数据的
request.setAttribute("id", 101);
request.setAttribute("name", "zs");
request.setAttribute("salary", 8000.0);
request.setAttribute("age",30);
//转发
//转发绝对跳转,不用加项目名,因为它只能跳转到项目内部
//创建转发对象
RequestDispatcher dispatcher = request.getRequestDispatcher("http://www.baidu.com");
//实现跳转
dispatcher.forward(request,response);
//重定向
//重定向跳转绝对路径,不能直接加上/,必须加上项目名,因为它可以跳转到任何路径
String contextPath = request.getContextPath();
response.sendRedirect(contextPath+"/index.jsp");
//这个和上面两句话是同样的效果
//response.sendRedirect("index.jsp");
}
}
在WebRoot下面创建list.jsp文件
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
</head>
<body>
<!--在小脚本中获取request绑定的参数,request是jsp九大内置对象,使用可以直接使用-->
<%
Object id=request.getAttribute("id");
Object name=request.getAttribute("name");
Object salary=request.getAttribute("salary");
Object age=request.getAttribute("age");
%>
<%=id%>
<%=name%>
<%=salary%>
<%=age%>
</body>
</html>
八.Jsp标签
标签的作用:简化代码.
1.用于页面的转发: <jsp:forward page="/xxx.jsp" ></jsp:forward>
page用于指明转发路径,可以代替创建转发对象,实现跳转两步
RequestDispatcher dispatcher = request.getRequestDispatcher("http://www.baidu.com");
dispatcher.forward(request,response);
2.用于页面的包含(动态包含) :<jsp:include page=" " flush="true"/>
page指明要包含的页面
<!--这个部分放在header.jsp中-->
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
</head>
<body>
<h1>this is header</h1>
<!--这个部分放在content.jsp中-->
<table border="1">
<tr><td>01</td><td>02</td></tr>
<tr><td>11</td><td>12</td></tr>
<tr><td>21</td><td>22</td></tr>
</table>
<!--这个部分放在footer.jsp中-->
<hr/>
<h1>copyright:2000-2019</h1>
</body>
</html>
创建include_static.jsp,将header.jsp、content.jsp、footer.jsp用静态包含在include_static.jsp中
在浏览器下访问http://localhost:8080/jsp/include_static.jsp,TomCat下work里面生成了include_005fstatic_jsp的java和class文件
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%--静态包含--%>
<%@ include file="header.jsp"%>
<%@ include file="content.jsp"%>
<%@ include file="footer.jsp"%>
创建include_dynamic.jsp,将header.jsp、content.jsp、footer.jsp用动态包含在include_dynamic.jsp中
在浏览器下访问http://localhost:8080/jsp/include_dynamic.jsp,TomCat下work里面生成了include_005fdynamic_jsp的java和class文件,还生成了header,content,footer的java和class文件
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!--动态包含-->
<jsp:include page="header.jsp"></jsp:include>
<jsp:include page="content.jsp"></jsp:include>
<jsp:include page="footer.jsp"></jsp:include>
静态包含和动态包含的区别
最终编译成java文件的数目不同
静态包含转换成java文件,包含文件的内容会复制到主题文件,作为一个整体编译。最终编译成一个java文件
动态包含是各个jsp文件分别转化,分别编译。最终编程成多个java文件。
执行时间不同:静态包含发生在:jsp>java文件阶段动态包含发生在:执行class文件阶段。动态加入
何时使用静态包含,何时使用动态包含
静态包含一般用于加载进页面显示后就再也不变的东西对页眉页脚,导航栏之类的静态内容
动态包含用于加载经常变化的、要求显示最新版本内容的东西对数据库实时查询,时间戳等动态内容
3.用于带有路径的标签下,传递参数:<jsp:param/>
4.用于在JSP中使用JavaBean:<jsp:useBean />
5.用于在JSP中向JavaBean设置属性的:<jsp:setProperty />
6.用于在JSP中JavaBean获得属性的:<jsp:getProperty />
九.Jsp试题
1.当response的状态行代码为哪个时,表示用户请求的资源不可用?(D)
A. 101 B. 202 C. 303 D. 404
404错误:服务器依据请求资源路径找不到对应的资源。
2.JSP的编译指令标记通常是指:(A)
A.Page指令、Include指令和Taglib指令
B.Page指令、Include指令和Plugin指令
C.Forward指令、Include指令和Taglib指令
D.Page指令、Param指令和Taglib指令
3.关于部署到Tomcat服务器的Java Web应用程序,正确的选项是(C)。
A. Java Web应用程序总是打包成WAR形式部署到Tomcat服务器
B. Java Web应用程序应该部署到Tomcat服务器的server子目录中
C.每个Java Web应用程序都有一个web.xml文件
D. Java Web应用程序的根目录下不能存放任何文件,所有html、gif等文件必须存放到某一子目录中
4.JSP的Page编译指令的属性Language的默认值是:(A)
A. Java B. C C. C# D. SQL
5.include指令用于在JSP页面静态插入一个文件,插入文件可以是JSP页面、HTML网页、文本文件或一段Java代码,但必须保证插入后形成的文件是(B)。
A. 是一个完整的HTML文件
B. 是一个完整的JSP文件
C. 是一个完整的TXT文件
D. 是一个完整的Java源文件
6.下面关于JSP作用域对象的说法错误的是(C)。
A. request对象可以得到请求中的参数
B. session对象可以保存用户信息
C. application对象可以被多个应用共享
D. 作用域范围从小到大是request、session、application
7.下列变量声明在( C )范围内有效?
<%! Date dateTime;
int countNum;
%>
A. 从定义开始处有效,客户之间不共享
B. 在整个页面内有效,客户之间不共享
C. 在整个页面内有效,被多个客户共享
D. 从定义开始处有效,被多个客户共享
8.下面是Servlet调用的一种典型代码:
<%@page contentType="text/html;charset=GB2312" %>
<%@ page import="java.sql.*" %>
<html>
<body bgcolor=cyan>
<jsp:forward page="helpHello"/>
</body>
</html>
该调用属于下述哪种。(D)
A. url直接调用
B. 超级链接调用
C. 表单提交调用
D. jsp:forward调用
<jsp:forward page=“helpHello”/>标签是转发, 重定向才是超链接。