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

mac2025-04-17  3

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

9大内置对象:

resuestresponsesessionoutpage context   用于存取其他隐含对象  如request response application 等pageexceptionapplication  服务器启动时就创建了 直到服务器关闭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页面将会有大量的、完成各个功能的代码混合,文件的结构混乱,后期不易维护,服务器的并发行也就大大降低。

最新回复(0)