mapengpeng1999@163.com JSP基本概念

JSP语法基础

java程序乱码,可能别人用utf-8编写代码,你是用gbk编写代码。
在这里插入图片描述

Java Server Pages:java服务器端页面,用来开发动态Web的技术,JSP本质上就是一个Servlet
最大特点:写JSP就像在写HTML,JSP后面编程只用来编写前端代码,不允许在JSP程序中出现JAVA代码,
区别:HTML只给用户提供静态的数据(让它动起来加上js事件,伪动态,没有和服务器端进行操作),
JSP页面可以嵌入JAVA代码,为用户提供动态数据。
思路:JSP到底怎么执行的。
1.代码层面没有任何问题
2.服务器内部工作
tomcat下work目录就是tomcat服务器的工作目录

浏览器向服务器发送请求,不管访问什么资源,其实都是在访问Servlet
jsp会被动态拼凑成java代码,JSP本质上就是一个Servlet

在这里插入图片描述
输出页面前增加的代码:
response.setContentType(“text/html”);//设置文本响应类型为HTML,(这就是jsp转换成html原因)
在这里插入图片描述
在这里插入图片描述

用户电脑上网。访问服务器。服务器中有web容器。tomcat中有多个网站,访问jsp,找jsp页面。
jsp不能直接使用,web容器帮着将jsp页面转换成java文件,**.jsp.java。
编译成**.jsp.class到服务器,服务器响应给用户,
用户真正拿到的是服务器处理完毕的class对象,这个对象就是servlet
访问jsp页面最后还是访问一个servlet
JSP后面编程只用来编写前端代码,不允许在JSP程序中出现JAVA代码,
所以JSP注释建议用前端注释<!--注释内容-->     快速注释建:Ctrl+Shift+?

网页中的跳转的方式有多种:
常见的a标签(a标签要点击才跳转),表单提交,jsp(jsp:forward)是运行执行到那行代码就跳转,错误页面跳转。
服务端跳转(转发):跳转后地址栏不发生变化的就是服务端跳转(转发)jsp:forward,错误页面跳转。
客户端跳转(重定向):跳转后地址栏发生变化的就是客户端跳转(重定向)a标签,表单提交。

1.JSP(java Server Page)注释

jsp是对java的补充(jsp = html + java)。
在jsp中可编写java代码,所以jsp中可以使用java的语法,包括注释,但jsp也有其自己的语法,
如jsp的注释分为两类三种:
*显示注释:使用的是html的注释风格。<!--注释内容-->
*隐式注释:java的注释://  /* */。jsp自己的注释:<%--注释内容--%>
显示注释和隐式注释的区别:
显示注释就是在查看网页源代码的时候可以看到注释的内容,而隐式注释在查看网页源代码的时候看不到注释的内容。
JSP后面编程只用来编写前端代码,不允许在JSP程序中出现JAVA代码,
所以JSP注释建议用前端注释<!--注释内容-->     快速注释建:Ctrl+Shift+?

2.scriptlet

scriptlet从字面的翻译来说叫做脚本小程序,在jsp中表示的是加入java代码,
所有的java代码要在jsp中编写的话就必须放在scriptlet中,有三种语法格式:

1.<%java代码%>:jsp程序段,在网页任何地方都可插入jsp程序段,
在程序段中可加入任何数量的java代码,在jsp程序段里变量(这里是局部变量)先定义后使用。
注意,不能在jsp程序段定义方法。

2.<%! java代码%>:jsp声明,可定义网页中的全局变量,这些变量在jsp页面任何地方都能使用,
方法,页面全局变量,甚至类的声明都可在Jsp中(但不建议声明类)。
在jsp程序段中定义的变量只能先声明后使用,而jsp声明中定义的变量是网页级别的,系统会优先执行。

3.jsp表达式输出<%=变量/返回值/表达式%>的作用是将其里面内容所运算的结果输出到客户端。
<%=hello%>等价于<%out.print(hello);%>
注意:jsp表达式中不能用分号;结束。在jsp表达式中不能出现多条语句。
jsp表达式的内容一定是字符串类型,或者能通过toString()函数转换成字符串的形式。
jsp表达式只能单行出现,且仅仅是把其中的运算结果输出到客户端。

第一种script:JSP程序段<%java代码%>,只能定义局部变量,编写大量语句:

<%@ 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>
<title>Insert title here</title>
</head>
<body>
<!-- 这个是html的注释风格 -->
<%--这个是jsp自己特有的注释 --%>
<%
	//只能够定义局部变量,编写大量语句
	int x = 100;
	String s = "Wanczy";
	System.out.println("HelloWorld");
	for(int i = 100;i <= 110;i++){
		System.out.println(s + (x*i));
	}
%>
</body>
</html>

第二种scriptlet:jsp声明<%! java代码%>,定义全局变量(这些变量在jsp页面任何地方都能使用)、在jsp程序段中定义的变量只能先声明后使用,而jsp声明中定义的变量是网页级别的,系统会优先执行。定义常量、定义方法、定义类,但在开发中肯定不会在jsp中编写一个类。

<%@ 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>
<title>Insert title here</title>
</head>
<body>
<%
	int i = add(10,20);
	System.out.println(i);
	Person p = new Person("张三",20);
	System.out.println(p);
%>
<%!
	//定义常量,定义方法,定义类(不建议)
	public static final String DRIVER = "oracle.jdbc.driver.OracleDriver";
	public static final String URL = "jdbc:oracle:thin:@XQ-20150326QHNH:1521:wanczy";
	public static final String DBNAME = "scott";
	public static final String PASSWORD = "wanczy";
	
	public int add(int x,int y){
		return x + y;
	}
	class Person{
		private int age;
		private String name;
		public Person(String name,int age){
			this.name = name;
			this.age = age ;
		}
		public String toString(){
			return "姓名:" + this.name + "\t年龄:" + this.age;
		}
	}
%>
</body>
</html>

第三种scriptlet:JSP表达式输出<%=java代码%>,可以输出变量、常量或者一个具体的值,输出的目标是页面。将其里面内容所运算的结果输出到客户端。

<%@ 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>
<title>Insert title here</title>
</head>
<body>
<%!
	//定义常量,定义方法,定义类(不建议)
	public static final String DRIVER = "oracle.jdbc.driver.OracleDriver";
	public static final String URL = "jdbc:oracle:thin:@XQ-20150326QHNH:1521:wanczy";
	public static final String DBNAME = "scott";
	public static final String PASSWORD = "wanczy";
%>
<h1><%= DRIVER %></h1>
<h1><%= URL %></h1>
<h1><%= DBNAME %></h1>
<h1><%= PASSWORD %></h1>
</body>
</html>
实际上,对于我们来说,想页面输出内容有三种方式:
·使用html代码(最优秀的方式, 但是不能输出java定义的变量或者常量)
·使用out.println();
·使用表达式输出<%=表达式输出%>
对于第一种来说,肯定是最优秀的方式,但是不能输出java定义的变量或者常量,
对于输出java定义的变量或者常量的话,可以使用第二种或者第三种编写方式,
那么对于第二种和第三种输出方式,哪一种更好呢?
以后JSP有java代码的话中输出只用<%=表达式输出%>,
但是后面开发中不允许JSP中有java代码,所以JSP开发还是用HTML输出方式。

范例:动态的打印表格,编写一个表单, 让用户输入行和列,提交到一个jsp页面,
此jsp页面按照提交过来的行和列的数据,动态打印此表格:

使用out.println()方式:

<%@ 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>
	<form action = "Demo09.jsp" method = "post">
		行:<input type="text" name="rows"><br>
		列:<input type="text" name="cols"><br>
		<button>打印表格</button>
	</form>
</body>
</html>
<%@ 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>
	<%
		//使用out.println()输出
		int rows = Integer.parseInt(request.getParameter("rows"));
		int cols = Integer.parseInt(request.getParameter("cols"));
	%>
	<table border='1'>
		<%
			for (int i = 0; i < rows; i++) {//循环行
		%>
		<tr>
			<%
				for (int j = 0; j < cols; j++) {
			%>
			<td>
				<%
					out.println(i*j);
				%>
			</td>
			<%
				}
			%>
		</tr>
		<%
			}
		%>
	</table>
</body>
</html>

使用表达式输出<%=表达式输出%>:

<%@ 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>
	<%
		//使用表达式输出<%=表达式输出%>
		int rows = Integer.parseInt(request.getParameter("rows"));
		int cols = Integer.parseInt(request.getParameter("cols"));
	%>
	<table border='1'>
		<%
			for (int i = 0; i < rows; i++) {//循环行
		%>
		<tr>
			<%
				for (int j = 0; j < cols; j++) {
			%>
			<td>
				<%=i*j %>
			</td>
			<%
				}
			%>
		</tr>
		<%
			}
		%>
	</table>
</body>
</html>
使用out.print()输出的话,查看网页源代码发现代码是挤压在一起的,但是用表达式输出的结果代码排列有序。
反馈出来的问题,使用out.print()输出内容不能够被一些前端的设计工具所识别,
所以在以后的开发中,在jsp中是绝对不允许再出现out.println()代码的。
JSP后面编程只用来编写前端代码,不允许在JSP程序中出现JAVA代码,
所以JSP注释建议用前端注释<!--注释内容-->     快速注释建:Ctrl+Shift+?

3.page指令

一般jsp程序都是以page指令开头。page指令可以设置一个jsp的行为,
可以进行MIME类型设置,页面编码设置,错误页面设置,导包指令设置。
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

3.1设置MIME类型

MIME类型:多功能网际邮件扩充协议,简单的说,就是在jsp中页面以何种形式来展示,
形式包含页面的打开格式和页面打开默认的编码。
contentType="text/html; charset=utf-8"
这行代码表示设置MIME类型,以html的方式打开页面,浏览器显示的默认编码是utf-8。
设置MIME类型,可以指定页面的显示方式,并且可以解决乱码问题,我们在开发中也可以将jsp设为其他的MIME类型,
比如以其他的格式打开,MIME类型有很多可以在tomcat的配置文件conf/web.xml中查找。

contentType="text/html; charset=GBK"
表示浏览器以html的方式,以GBK字符集进行页面的展示,当然我们也可以修改其他的方式,比如修改为文档的方式打开。
contentType="application/msword; charset=GBK"

3.2设置页面的编码

page指令也可以设置编码格式(字符集)。通过pageEncoding设置pageEncoding="utf-8",
和MIME设置浏览器的编码格式一样,一般都是用utf-8。设置utf-8(万国码)就不会乱码。

pageEncoding 表示的是页面可以编写的内容的字符集。所以和MIME一样,设置为UTF-8的字符集,可以省略。
Language 也是可以是省略的,表示设置页面的scriptlet语言,都设置为java。

3.3错误页面设置

当页面出现错误时一般使用页面跳转形式跳转到一个指定页面。一般用page指令配置。
大家肯定见过一种情况,如果页面出现错误,会显示404(路径错误)和500(程序本身报错),
但是在一些正式的网页上,是看不到类似的信息的,而是跳转到一个指定的页面,这就是通过配置错误页面的方式完成的。
当这个jsp页面存在异常,但是异常信息并不希望直接显示在页面。
errorPage=”error.jsp”表示一旦当前页面存在错误,则直接跳转到error.jsp指定页面中。
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" errorPage=”error.jsp”%>

当然还可以标识一个页面为错误页面:
<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8" isErrorPage="true"%>
    
除了使用page指令配置错误页面之外,还可以在conf/web.xml中配置错误页面。
	<error-page>
 		<error-code>404</error-code>
 		<location>/error1.jsp</location>
 	</error-page>
 	<error-page>
 		<error-code>500</error-code>
 		<location>/error2.jsp</location>
 	</error-page>
当页面出现错误时一般使用页面跳转形式跳转到一个指定页面。一般用page指令配置。

3.4导包指令设置

导包,我们之前在java中,直接使用import就可以进行导包了,在jsp中,也可以通过import指令进行导包,
比如导入java.util.*,java.sql.*,还可以导入我们自己写的包,
而且导包指令是page指令中唯一可以设置多次的指令。
就是说可以多次用import导入多个包,或者用一个import导包,多个包分别用逗号隔开。

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" errorPage="error.jsp"%>
<%@ page import="java.sql.*,java.util.*" %>
<%@ page import="com.waczy.entrity.Person" %>
<!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>
	<%
		Person p = new Person("张三",20);
		System.out.println(p);
	%>
</body>
</html>

既然可以导入sql包,那么是不是意味着jsp可以连接数据库了?要加驱动程序

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
 <%@ page import="java.sql.*,java.util.Date"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Insert title here</title>
</head>
<body>
<!-- 这个是html的注释风格 -->
<%--这个是jsp 的注释 --%>
<%!
	//定义常量,定义方法,定义类(不建议)
	public static final String DRIVER = "oracle.jdbc.driver.OracleDriver";
	public static final String URL = "jdbc:oracle:thin:@XQ-20150326QHNH:1521:wanczy";
	public static final String DBNAME = "scott";
	public static final String PASSWORD = "wanczy";
%>
	<table border="1">
	<caption>雇员信息表</caption>
	<tr><th>雇员编号</th><th>雇员姓名</th><th>雇员岗位</th><th>受雇日期</th><th>雇员薪资</th><th>雇员佣金</th></tr>
<%
	Connection conn = null;
	PreparedStatement pstate = null;
	ResultSet res = null;
	try{
		Class.forName(DRIVER);//加载驱动程序
		conn = DriverManager.getConnection(URL, DBNAME, PASSWORD);
		String sql = "select empno,ename,job,hiredate,sal,comm from emp";
		pstate = conn.prepareStatement(sql);
		res = pstate.executeQuery();
		while(res.next()){
			int empno = res.getInt(1);
			String ename = res.getString(2);
			String job = res.getString(3);
			Date hiredate = res.getDate(4);
			double sal = res.getDouble(5);
			double comm = res.getDouble(6);
		%>
			<tr>
				<td><%=empno %></td>
				<td><%=ename %></td>
				<td><%=job %></td>
				<td><%=hiredate %></td>
				<td><%=sal %></td>
				<td><%=comm %></td>
			</tr>
			
		<%
		}
	}catch(Exception e){
		e.printStackTrace();
	}finally{
		res.close();
		pstate.close();
		conn.close();
	}
%>
</table>
</body>
</html>

4.包含指令(了解)

包含指令(jsp:include)实际上就是一个页面可以包含其他页面,
这种包含属于jsp的指令标签格式,只要是jsp的指令标签,就一定要进行完结,要有头有尾有开始标签有结束标签。
包含指令有两种语法格式:
第一种:静态包含,可包含任意格式文件,包含的是文件的内容。
<@include file=”被包含的页面”/>

第二种:动态包含,使用jsp的include标签进行包含,可以向被包含的页面传递参数,
有两种语法格式:(可不传参数也可传多个参数)如果不向被包含的页面传递参数有点像静态包含。
第一种,不传递参数:
<jsp:include page=”被包含的页面”/> 
第二种,传递参数:
<jsp:include page=”被包含的页面”/>
<jsp:param value=”参数值1” name=”参数名称1”/>
<jsp:param value=”参数值2” name=”参数名称2”/>
</jsp:include>

4.1静态包含

<%@ 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>
	<h1>这里是Demo01.jsp</h1>
	<%@include file="Demo02.jsp" %>
	<%@include file="Demo02.ini" %>
	<%@include file="Demo02.txt" %>
</body>
</html>
通过程序运行发现,静态包含,可以包含任意格式的文件,包含的是文件的内容。

4.2动态包含

动态包含实际上也有两种语法格式:
·向被包含的页面传递参数:
<jsp:include page=”被包含的页面”/>
<jsp:param value=”参数值1” name=”参数名称1”/>
<jsp:param value=”参数值2” name=”参数名称2”/>
</jsp:include>
·不向被包含的页面传递参数,那么和静态包含类似,但是本质依然是动态包含
<jsp:include page=”被包含的页面”/>

范例:进行动态包含,并且向被包含的页面传递参数

<%@ 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>
	<%!
	public static final String DRIVER = "oracle.jdbc.driver.OracleDriver";
	public static final String URL = "jdbc:oracle:thin:@XQ-20150326QHNH:1521:wanczy";
	public static final String DBNAME = "scott";
	public static final String PASSWORD = "wanczy";
	%>
	<h1>这里是Demo03.jsp</h1>
	<jsp:include page="Demo04.jsp">
		<jsp:param value="<%=DRIVER %>" name="driver"/>
		<jsp:param value="<%=URL %>" name="url"/>
		<jsp:param value="<%=DBNAME %>" name="dbname"/>
		<jsp:param value="<%=PASSWORD %>" name="password"/>
	</jsp:include>
</body>
</html>
<%@ 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>
<h1>这里是Demo04.jsp</h1>
	<h1><%=request.getParameter("driver") %></h1>
	<h1><%=request.getParameter("url") %></h1>
	<h1><%=request.getParameter("dbname") %></h1>
	<h1><%=request.getParameter("password") %></h1>
</body>
</html>

4.3动态包含和静态包含的区别

从语法上面来看:
·静态包含不能向被包含的页面传递参数
·动态包含可以向被包含的页面传递参数
动态包含是将结果进行包含,静态包含的是文件的内容。
动态包含的是JSP文件,静态包含任意格式文件。
还有一个区别,我们通过代码来观察,静态包含:
<%@ 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>
	<%
		int x = 100;
	%>
	<h1>这里是Demo01.jsp</h1>
	<h1><%=x %></h1>
	<%@include file="Demo02.jsp" %>
</body>
</html>


<%@ 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>
	<%
		int x = 100;
	%>
	<h1>这里是Demo02.jsp</h1>
	<h1><%=x %></h1>
</body>
</html>

在Demo01.jsp中定义了x变量,在Demo02.jsp中也定义了x变量,
Demo01.jsp包含Demo02.jsp,使用的是静态包含,
运行发现错误,提示x变量被重复定义了,说明静态包含包含的是文件的内容。
动态包含:
<%@ 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>
	<%
		int x = 100;
	%>
	<h1>这里是Demo01.jsp</h1>
	<h1><%=x %></h1>
	<jsp:include page="Demo02.jsp" />
</body>
</html>


<%@ 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>
	<%
		int x = 100;
	%>
	<h1>这里是Demo02.jsp</h1>
	<h1><%=x %></h1>
</body>
</html>


使用动态包含,就不会出现上面静态包含所出现的问题,因为动态包含是将结果进行包含。

动态包含是将结果进行包含,静态包含包含的是文件的内容。

静态包含动态包含
传递参数不能够向被包含的页面传递参数可以向被包含的页面传递参数
执行顺序先包含文件的内容,在处理程序先处理结果,再将结果进行包含

5.跳转指令(重要)

jsp(jsp:forward)有两种语法格式:

1.不向跳转后的页面传递参数,单标签
<jsp:forward page=”跳转后的页面”/>  

2.向跳转后的页面传递参数,双标签
<jsp:forward page=”跳转后的页面”>
<jsp:param value=”参数值1” name=”参数名称1”/>
<jsp:param value=”参数值2” name=”参数名称2”/>
。。。。
</jsp:forward>
<%@page contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<html>
<head>
</head>
<body>
	<%!
	public static final String DRIVER = "oracle.jdbc.driver.OracleDriver";
	public static final String URL = "jdbc:oracle:thin:@XQ-20150326QHNH:1521:wanczy";
	public static final String DBNAME = "scott";
	public static final String PASSWORD = "wanczy";
	%>
	<h1>Demo01.jsp</h1>
	<h1><a href="Demo02.jsp">Demo02.jsp</a></h1>
	<!-- 跳转 -->
	<%-- 
	<jsp:forward page="Demo02.jsp">
		<jsp:param value="<%=DRIVER%>" name="driver" />
		<jsp:param value="<%=URL%>" name="url" />
		<jsp:param value="<%=DBNAME%>" name="dbname" />
		<jsp:param value="<%=PASSWORD%>" name="password" />
	</jsp:forward>
	<!-- 不传递参数的话,不能使用此种完结方式 --> 
	--%>
</body>
</html>


<%@ 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>
<h1>这里是Demo02.jsp</h1>
	<%-- 
	<h1><%=request.getParameter("driver") %></h1>
	<h1><%=request.getParameter("url") %></h1>
	<h1><%=request.getParameter("dbname") %></h1>
	<h1><%=request.getParameter("password") %></h1> 
	--%>
</body>
</html>
使用jsp:forward标签指令完成的跳转,跳转后地址栏不会发生变化,
但是使用a标签进行跳转的话,地址栏会发生变化,这个时候我们来解释一下下面的四个概念:

服务端跳转(转发):跳转后地址栏不发生变化的就是服务端跳转(转发)jsp:forward,错误页面跳转。
客户端跳转(重定向):跳转后地址栏发生变化的就是客户端跳转(重定向)a标签,表单提交。

网页中的跳转的方式有多种:
常见的a标签(a标签要点击才跳转),表单提交,jsp(jsp:forward)是运行执行到那行代码就跳转,错误页面跳转。

总结:

1.对于jsp来说,本章就是语法基础,要熟练的使用三种scriptlet;
2.以后开发中,要向页面中输出变量、常量或其他的值,不能够使用out.println(),可以使用表达式输出;
3.page指令可以设置的内容有很多,经常设置的就是MIME类型,导包和配置错误页面,配置页面编码,导包指令是page指令中唯一可以设置多次的指令;
4.要理解动态包含和静态包含的区别;
5.对于转发和重定向来说,转发后地址栏不会变化,而重定向后会发生变化。

6.课后练习:

1. 用户输入用户名和密码进行登录验证,登录成功后显示图书信息,登录失败提示用户登录失败请重新登入。
login.jsp , loginCheck.jsp,bookInfo.jsp,fail.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="loginCheck.jsp" method="post">
	用户名:<input type="text" name="username" />
	<br>
	密码:<input type="password" name="password" />
	<br>
	<input type="submit" value="登入" />
</form>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.sql.*,com.wanbangee.util.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
String username = request.getParameter("username");
String password = request.getParameter("password");
Connection conn = null;
PreparedStatement pstate = null;
ResultSet res = null;
conn = MYSQLDBUtil.getConnection();
String sql = "select acc_id,acc_balance from account where acc_name = ? and acc_pass = ?";
pstate = conn.prepareStatement(sql);
pstate.setString(1, username);
pstate.setString(2, password);
res = pstate.executeQuery();
while(res.next()){
	//登入成功,跳转到books.jsp页面
%>
	<jsp:forward page="bookInfo.jsp">
		<jsp:param value="<%= username %>" name="username"/>
	</jsp:forward>
	
<% 
}
//登入失败,跳转到fail.jsp重新登入
%>
<jsp:forward page="fail.jsp" />
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.sql.*,com.wanbangee.util.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>登入成功:欢迎你<%= request.getParameter("username") %></h1>
<table border="1">
	<caption>图书信息表</caption>
	<tr><th>图书编号</th><th>图书名</th><th>图书单价</th><th>图书库存编号</th></tr>
<%

	Connection conn = null;
	PreparedStatement pstate = null;
	ResultSet res = null;
	try{
		conn = MYSQLDBUtil.getConnection();
		String sql = "select book_no,book_name,book_price,stock_id from book_info";
		pstate = conn.prepareStatement(sql);
		res = pstate.executeQuery();
		while(res.next()){
			int bookNo = res.getInt(1);
			String bookName = res.getString(2);
			double bookPrice = res.getDouble(3);
			int stockId = res.getInt(4);
		%>
			<tr>
				<td><%=bookNo %></td>
				<td><%=bookName %></td>
				<td><%=bookPrice %></td>
				<td><%=stockId %></td>
			</tr>
			
		<%
		}
	}catch(Exception e){
		e.printStackTrace();
	}finally{
		res.close();
		pstate.close();
		conn.close();
	}
%>
</table>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>登入失败,请重新<a href="login.jsp">登入</a></h1>
</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值