- JSP:Java server page -- 服务端页面脚本 -- 即可操作DB
- 从创建JSP页面可知JSP页面包含了HTML页面的内容
- 该节内容重点掌握JSP的内置对象,JSP有9大内置对象,但是只有4个是常用的:
request page context page域 session session域 application context域 9大内置对象:
resuest | response | session |
out | page context 用于存取其他隐含对象 如request response application 等 | page |
exception | application 服务器启动时就创建了 直到服务器关闭 | config 取的服务器所有配置信息 |
内置对象就是在该页面可以直接对这些对象进行调用,而不需要先创建对应的实体类再来调用
part 1:JSP页面简介
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!-- 上述尖括号+%用于书写Java代码,而+@表明即将使用指令 -->
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
<!-- JSP基本语法:定义变量 -->
<%
int a = 10;
String name = "javaee";
//System.out.print(name); 这样的输出只是输出到eclipse的控制台,而不是用户看到的前端页面
out.print(name);
//定义方法,报错
/* public void test(){
} */
%>
<!-- %+!:只能用于申明一些变量和方法,而上述的只+%的形式除了不能申明方法外,其他的都可以 -->
<%!
int num = 100;
/* public void test(){
out.print(num);
在该处做输出,报错,因为在该尖括号+%+!中只能进行申明操作
} */
%>
<!-- 输出表达式,不能出现分号,上一个+!的,只能用于申明,这一个+=的只能用于执行/输出,不能做申明 -->
<%=num%>
</body>
</html>
part 2:熟悉很早以前只用JSP页面来提供服务的体系
在早些时候JSP页面要完成DB操作(增删改查)、业务逻辑(对用户输入做处理)、实体类(调用实体类来实例化用户对象,就是初始化用户数据等操作)、显示(即向用户显示业务逻辑操作的结果)
首先创建一个JavaBean,即实体类:
package com.entity;
public class Student {
int id;
String name;
String gender;
public Student() {
}
public Student(int id, String name, String gender) {
super();
this.id = id;
this.name = name;
this.gender = gender;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
}
其次创建showInfo.jsp来完成所有的功能:
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@ page import="com.entity.Student" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
<style>
p{
width:300px;
height:50px;
line-height: 50px;
text-align:center;
border:1px solid red;
}
</style>
</head>
<body>
<%
Student s1 = new Student(122,"JAVAEE","女");
out.print("<h3>个人信息</h3>");
out.print("<p>"+s1.getId()+s1.getName()+s1.getGender()+"</p>");
%>
<!-- 以前较老的,比较小的网站的网页都是使用以上的方法写的
当然还包括了对数据库的增删改查都是在一个JSP网页上实现的
但是这样会有一个弊端--即随着发展,该JSP网页会越来越大,该JSP网页越来越难维护
最制命的问题是,网页越大,用户请求后占用服务器的资源也就越多
该服务器可并发服务的质量就会变差,很容易就会出现崩溃现象 -->
</body>
</html>
part3:加入servlet,分担JSP页面的负担,有效缓解JSP页面过大带来的严重后果
servlet主要分担DB操作&实体类的调用
JSP保留业务逻辑(该处业务逻辑主要指向servlet传数据&在servlet处理之后取有关数据,用以完成显示功能)&显示功能
创建一个首页(index.jsp)供用户访问(只暴露一个查询接口,用于连接后端做处理的servlet):
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!-- 上述尖括号+%用于书写Java代码,而+@表明即将使用指令 -->
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
<a href="search">查询</a>
</body>
</html>
创建一个StudentServlet.java的servlet去完成对实体类的调用(即初始化用户信息,以及将其信息存入jsp一个常用的内置对象request中,供向用户显示页面获取数据进行显示)
package com.servlets;
import java.io.IOException;
import java.io.PrintWriter;
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 com.entity.Student;
@WebServlet("/search")//映射请求url为search的所有请求
//上述注解就代替了原来的web.xml文件对servlet与jsp映射的配置
public class StudentServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Student s1 = new Student(123,"JAVA","男");
// PrintWriter out = response.getWriter();
// out.print("<h3>个人信息</h3>");
// out.print("<p>"+s1.getId()+s1.getName()+s1.getGender()+"</p>");
// 用上述输出out对象即可对实体类的信息进行输出。但是这样输出很麻烦,需要写大量的out.print语句
//以下介绍另外一种较高效的做法
//使用jsp的内置对象“request”,即将实体对象存入request的作用域中
//作用域就是一个虚拟的空间,其中可以存放许多数据,实现这些数据在前端与后台之间来回的传输
request.setAttribute("stu", s1);
//从servlet到页面的方式1,这种方式叫转发,是在服务器里面直接跳转至指定页面上,效率最高
request.getRequestDispatcher("showInfo.jsp").forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
创建一个显示页面(showInfo.jsp),用于向用户显示交互结果:
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@ page import="com.entity.Student" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
<style>
p{
width:300px;
height:50px;
line-height: 50px;
text-align:center;
border:1px solid red;
}
</style>
</head>
<body>
<%
Student s1 = new Student(122,"JAVAEE","女");
out.print("<h3>个人信息</h3>");
out.print("<p>"+s1.getId()+s1.getName()+s1.getGender()+"</p>");
%>
<!-- 以前较老的,比较小的网站的网页都是使用以上的方法写的
当然还包括了对数据库的增删改查都是在一个JSP网页上实现的
但是这样会有一个弊端--即随着发展,该JSP网页会越来越大,该JSP网页越来越难维护
最制命的问题是,网页越大,用户请求后占用服务器的资源也就越多
该服务器可并发服务的质量就会变差,很容易就会出现崩溃现象 -->
<hr color = bule/>
<%
//从作用域中取出名为stu的对象,返回的是一个object类型的对象
//request的setAttribute在存储对象类型的数据时,会自动将其强转为object类型的对象
//即忽略原类型,并将类型提升为object类型,即提升为基类
//因此在该处接收的时候不能通过Student类型的对象进行接收
//最好也不要做类型的强转
Student ss =(Student) request.getAttribute("stu");
//注意:该处的Student类型的实体类名不可与上面代码块中的实体名重复
//因为只要是在一个网页上的Java代码,不管有多少对尖括号+%
//最终编译的时候都会被整合到一起,就所有代码组成一个Java文件
out.print("<h3>个人信息</h3>");
out.print("<p>"+ss.getId()+ss.getName()+ss.getGender()+"</p>");
%>
</body>
</html>
这一段代码是在index.jsp基础上修改的,所以会含有index.jsp页面的代码,但是这正好将两种向客户提供服务的方式做一个对比