Jsp入门

一.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”/>标签是转发, 重定向才是超链接。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值