request | page context page域 | session session域 | application context域 |
9大内置对象:
resuest | response | session |
out | page context 用于存取其他隐含对象 如request response application 等 | page |
exception | application 服务器启动时就创建了 直到服务器关闭 | config 取的服务器所有配置信息 |
内置对象就是在该页面可以直接对这些对象进行调用,而不需要先创建对应的实体类再来调用
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
Insert title here
<%
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%>
在早些时候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" %>
Insert title here
<%
Student s1 = new Student(122,"JAVAEE","女");
out.print("个人信息
");
out.print(""+s1.getId()+s1.getName()+s1.getGender()+"
");
%>
servlet主要分担DB操作&实体类的调用
JSP保留业务逻辑(该处业务逻辑主要指向servlet传数据&在servlet处理之后取有关数据,用以完成显示功能)&显示功能
创建一个首页(index.jsp)供用户访问(只暴露一个查询接口,用于连接后端做处理的servlet):
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
Insert title here
查询
创建一个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("个人信息
");
// out.print(""+s1.getId()+s1.getName()+s1.getGender()+"
");
// 用上述输出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" %>
Insert title here
<%
Student s1 = new Student(122,"JAVAEE","女");
out.print("个人信息
");
out.print(""+s1.getId()+s1.getName()+s1.getGender()+"
");
%>
<%
//从作用域中取出名为stu的对象,返回的是一个object类型的对象
//request的setAttribute在存储对象类型的数据时,会自动将其强转为object类型的对象
//即忽略原类型,并将类型提升为object类型,即提升为基类
//因此在该处接收的时候不能通过Student类型的对象进行接收
//最好也不要做类型的强转
Student ss =(Student) request.getAttribute("stu");
//注意:该处的Student类型的实体类名不可与上面代码块中的实体名重复
//因为只要是在一个网页上的Java代码,不管有多少对尖括号+%
//最终编译的时候都会被整合到一起,就所有代码组成一个Java文件
out.print("个人信息
");
out.print(""+ss.getId()+ss.getName()+ss.getGender()+"
");
%>
这一段代码是在index.jsp基础上修改的,所以会含有index.jsp页面的代码,但是这正好将两种向客户提供服务的方式做一个对比