JAVAEE 第二课 ----- ch3 ----- JSP与JSP的内置对象(request)

  1. JSP:Java server page -- 服务端页面脚本 -- 即可操作DB
  2. 从创建JSP页面可知JSP页面包含了HTML页面的内容
  3. 该节内容重点掌握JSP的内置对象,JSP有9大内置对象,但是只有4个是常用的:
    requestpage context   page域session    session域application  context域

    9大内置对象:

resuestresponsesession
outpage context   用于存取其他隐含对象  如request response application 等page
exceptionapplication  服务器启动时就创建了 直到服务器关闭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页面的代码,但是这正好将两种向客户提供服务的方式做一个对比

 

小结:上述代码中,只涉及到了实体类的数据初始化,然后在JSP页面上进行显示,所以看起来加上servlet之后好像与原来纯JSP提供访问支持并没有什么区别,甚至更加繁琐了,但是上述例子中只是对一个用户的信息做了静态初始化(即在网页内部将用户信息写死了,各个用户点击查看的数据信息都是一样的,而不是根据各个用户的信息/要求 显示不同的数据信息),并没有连接数据库对用户数据进行增删改查,如果加上数据库这些操作之后,你就会发现有servlet支持的版本的JSP页面代码很少(只保留了业务逻辑【用于提交用户输入】与显示数据的代码),结构很清晰,其对应在服务器上占用的资源也就很少,服务器的并发性也就更好,相反没有servlet支持的版本的JSP页面将会有大量的、完成各个功能的代码混合,文件的结构混乱,后期不易维护,服务器的并发行也就大大降低。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值