• Web阶段:第十二章:JSP动态页面


    作者:java_wxid

    1.什么是Jsp?
    jsp是java server page,java的服务器页面。
    2.为什么要学习jsp技术
    因为jsp技术可以很好的解决在Servlet程序中回传数据是html内容,这个问题。

    在Servlet程序中回传html数据,为什么是个问题?

    public class PrintHtml extends HttpServlet {
    	private static final long serialVersionUID = 1L;    
    	protected void doGet(HttpServletRequest request,
    			HttpServletResponse response) throws ServletException, IOException {
    		// 解决响应乱码
    		response.setContentType("text/html; charset=UTF-8");    		
    		// 回传一个html页面的数据
    		PrintWriter writer = response.getWriter();
    		writer.write("<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    ");
    		writer.write("<html>
    ");
    		writer.write("	<head>
    ");
    		writer.write("		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    ");
    		writer.write("		<title>Insert title here</title>
    ");
    		writer.write("	</head>
    ");
    		writer.write("	<body>
    ");
    		writer.write("		这是hello的html页面
    ");
    		writer.write("	</body>
    ");
    		writer.write("</html>");
    	}
    }
    

    可以看到创建一个html页面非常繁琐

    3.如何创建一个jsp动态页面。
    在这里插入图片描述
    4.如何修改jsp页面的默认编码?
    在这里插入图片描述
    小结:
    html和jsp一样。都在放在webContent目录下
    WebContent
    a.html =====>>>> http://ip:port/工程名/a.html
    b.jsp =====>>>> http://ip:port/工程名/b.jsp

    5.jsp的本质是什么。
    jsp本质上,也是一个Servlet程序。

    当我们第一次访问jsp页面的时候,Tomcat服务器会把jsp翻译成为java源文件,然后保存到Tomcat服务器的work目录下。
    双击Tomcat v7.0 Server at localhost [Started ,Synchronized],弹出如下窗口
    在这里插入图片描述
    jsp生成的class文件和java源文件
    在这里插入图片描述
    我们打开a_jsp.java源文件,不难发现生成的这个类继承了HttpJspBase类。
    在这里插入图片描述
    然后我们再通过查看源代码发现,HttpJspBase又继承了HttpServlet程序。所以生成的类本质上也是一个Servlet程序。
    在这里插入图片描述
    jsp翻译成为Servlet源文件,全名规则(了解大概):
    a.jsp 翻译之后命名的全名为:a_jsp.java
    b.jsp 翻译之后命名的全名为:b_jsp.java

    源文件名.jsp 翻译之后是: 源文件名_jsp.java

    6.jsp的三种语法
    a)jsp头部的page指令

    <%@ page language=“java” contentType=“text/html; charset=UTF-8”
    pageEncoding=“UTF-8”%>

    i.language属性 值只能是java。表示jsp翻译之后是java源文件。
    ii.contentType属性 返回的内容类型。response.setContentType的参数值。
    iii.pageEncoding属性 是当前jsp页面的字符集
    iv.import属性 可以在jsp页面中导入需要的包和类。
    v.autoFlush属性 设置jsp中的out输出流是否自动刷新 默认是true(一般都不会修改自动刷新为false),
    当jsp中out输出流的缓冲区满了之后,就会自动刷新。
    vi.buffer属性 设置jsp中的out输出流的缓冲区大小。默认是8kb
    在这里插入图片描述
    vii.errorPage属性 设置当jsp运行时出错,就自动跳转的页面。
    viii.isErrorPage属性 设置当前jsp是否是错误页面,默认是false,表示不启动异常对象。设置为true,可以启用Exception异常对象
    ix.session 属性 设置访问jsp的时候,是否创建Session会话对象。默认是true.
    x.extends 属性 extends继承属性是预留给服务器厂商使用的。(基本都不会动)

    b)jsp中的三种脚本
    i.声明脚本(几乎不用)
    声明脚本的格式: <%! 声明代码 %>

    声明脚本可以声明在类的内部定义的代码。

    1.我们可以定义全局变量。
    2.定义static静态代码块
    3.定义方法
    4.定义内部类

    测试代码:

    	<body>
    <!-- 1.我们可以定义全局变量。 -->
    		<%! 
    			int i = 0;
    			private static Map<String,Object> map = new HashMap<String,Object>();
    		%>
    <!-- 2.定义static静态代码块 -->
    		<%!
    			static {
    				map.put("key1", "value1");
    				map.put("key2", "value2");
    				map.put("key3", "value3");
    			}
    		%>
    <!-- 3.定义方法 -->
    		<%!
    			public void abc(){
    				System.out.println("国哥真帅!");
    			}
    		%>
    <!-- 4.定义内部类 -->
    		<%!
    			private static class A {
    				private String name;
    			}
    		%>
    	</body>
    

    在这里插入图片描述
    ii.表达式脚本
    表达式脚本的格式:<%=表达式 %>

    表达式脚本可以在jsp页面中输出数据。
    表达式脚本都会被翻译到_jspService方法中
    表达式脚本翻译之后都是out.print进行输出
    表达式脚本中的表达式不能以分号结尾
    由于表达式脚本翻译之后都在_jspService方法中,所以在_jspService方法中的对象都可以在表达式脚本中直接使用。

    1.输出整型
    2.输出浮点型
    3.输出字符串
    4.输出对象
    在这里插入图片描述
    iii.代码脚本
    代码脚本的格式是: <% 代码脚本 %>
    代码脚本可以写以方法中可以写的任何代码。
    代码脚本翻译之后都在_jspService方法中

    1.代码脚本----if 语句
    2.代码脚本----for 循环语句
    3.翻译后java文件中_jspService方法内的代码都可以写
    在这里插入图片描述
    c)jsp中的三种注释
    i.html注释
    <!-- html注释 -->
    翻译之后是out.write输出到客户端。

    ii.java注释
    // 单行注释
    /* 多行注释 */
    Java 注释 翻译之后会原封不动翻译到源代码中

    iii.jsp注释
    <%-- 这是jsp注释 --%>
    jsp注释 在翻译的时候,会被忽略掉

    7.jsp九大内置对象

    在这里插入图片描述
    8.jsp四大域对象
    pageContext ====>>>> request ====>>>>> session =====>>>>> application
    域对象 数据操作范围
    pageContext 当前jsp页面
    request 同一次请求
    session 同一次会话(打开浏览器,访问服务器之后会话就打开了,只要浏览器不关。会话都在)
    application 一个web工程

    四个域的数据操作范围从小到大分别是:pageContext====>>>request====>>>session=====>>>>application

    四个域都可以用来保存数据,如何挑选使用?
    四个域从小到大进行优先选择。

    Context1.jsp页面

    	<body>
    		<h1>Context1.jsp页面</h1>
    		<%
    			pageContext.setAttribute("key", "pageContextData");
    			request.setAttribute("key", "requestData");
    			session.setAttribute("key", "sessionData");
    			application.setAttribute("key", "applicaionData");
    		%>	
    		pageContext域:<%=pageContext.getAttribute("key") %><br/>
    		request域:<%=request.getAttribute("key") %><br/>
    		session域:<%=session.getAttribute("key") %><br/>
    		application域:<%=application.getAttribute("key") %><br/>
    		<%
    // 			request.getRequestDispatcher("/Context2.jsp").forward(request, response);
    		%>
    	</body>
    

    Context2.jsp页面

    <body>
    	<h1>Context2.jsp页面</h1>
    	pageContext域:<%=pageContext.getAttribute("key") %><br/>
    	request域:<%=request.getAttribute("key") %><br/>
    	session域:<%=session.getAttribute("key") %><br/>
    	application域:<%=application.getAttribute("key") %><br/>
    </body>
    

    9.jsp中的out输出和response.getWriter输出的区别
    在这里插入图片描述
    现在我们都知道out和response都可以往页面上输出数据。
    通过观察jsp翻译之后的源码我们发现,都是使用out进行输出。所以我们以后也是统一使用out进行输出操作。
    out.write 可以输出字符串
    out.print 可以输出任意数据
    深入浅出:统一使用out.print进行输出

    10.jsp的常用标签
    a)jsp静态包含

    <%--
    	<%@ include file="" %> 是静态包含。
    		静态包含地址中打头的斜杠,
    		表示http://ip:port/工程名/	映射到代码的WebContent目录
    		
    		
    	静态包含,其实本质上,只是把被包含的jsp页面的内容。原封不动的拷贝到被包含的位置执行。
    	静态包含,不会翻译被包含的jsp文件。
     --%>
    <%@ include file="/include/footer.jsp" %>
    

    b)jsp标签-动态包含

    <%--
    		<jsp:include page=""></jsp:include> 是动态包含
    			动态包含地址中打头的斜杠,
    			表示http://ip:port/工程名/	映射到代码的WebContent目录			  			
    		动态包含,会把被包含的jsp页面也翻译成为servlet程序。
    		动态包含,会翻译成为如下语句:
    		JspRuntimeLibrary.include(request, response, "/include/footer.jsp", out, false);
    		等价于把request,response,out对象传递给footer.jsp所翻译出来的Servlet去执行使用。
    		动态包含,还可以传递参数
    	 --%>
    	<jsp:include page="/include/footer.jsp">
    		<jsp:param value="wzg168" name="username"/>
    		<jsp:param value="123456" name="password"/>
    </jsp:include>
    

    动态包含底层原理:
    在这里插入图片描述

    c)jsp标签-转发
    <jsp:forward page="/Context2.jsp"></jsp:forward>
    请求转发功能,
    跟request.getRequestDispatcher("/Context2.jsp").forward(request, response);代码功能完全一样
    11.静态包含和动态包含的区别
    在这里插入图片描述随着整个javaEE技术的不断升级,那么jsp这种技术,在整个javaEE体系中的定位慢慢发生变化。
    jsp的定位慢慢就变成了,只是用来输出html页面数据而已。所以一般情况下。都使用静态包含。

    jsp的练习题
    练习一:在jsp中输出10*10的表格

    <%@ 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>
    <style type="text/css">
    	table{
    		 500px;
    		border: 1px solid red;
    		border-collapse: collapse;
    	}
    	th , td{
    		border: 1px solid red;
    	}
    </style>
    	</head>
    	<body>
    		<table>
    		<%	for (int i = 1; i <= 10; i++) { %>
    			<tr>
    			<%	for (int j = 1; j <= 10; j++) { %>
    				<td><%=i + "," + j %></td>
    			<%  } %>
    			</tr>
    		<%  } %>
    		</table>
    	</body>
    </html>
    

    练习二:在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>
    		<center>
    			<h1>九九乘法口诀表</h1>
    			<table width="600">
    			<% for(int i = 1; i < 10; i++){ %>
    				<tr>
    				<% for(int j = 1; j <= i ; j++){ %>
    					<td><%=j + "x" + i + "=" + (j*i) %></td>
    				<% } %>
    				</tr>
    			<% } %>
    			</table>
    		</center>
    	</body>
    </html>
    

    练习三:jsp输出一个表格,里面有20个学生信息。
    请求转发的流程示例:
    在这里插入图片描述
    Student类

    public class Student {
    
    	private Integer id;
    	private String name;
    	private String phone;
    	private String email;
    
    	public Student(Integer id, String name, String phone, String email) {
    		super();
    		this.id = id;
    		this.name = name;
    		this.phone = phone;
    		this.email = email;
    	}
    
    	public Student() {
    		super();
    	}
    

    SearchStduent程序

    public class SearchStudent extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    
    	protected void doGet(HttpServletRequest request,
    			HttpServletResponse response) throws ServletException, IOException {
    		// 获取请求参数
    		// 查询学生信息
    		// 得到多个学生信息
    		List<Student> stus = new ArrayList<Student>();
    		for (int i = 1; i < 21; i++) {
    			stus.add(new Student(i,"name"+i, "phone"+i,"email"+i));
    		}
    		// 把学生信息保存到request域中
    		request.setAttribute("stus", stus);
    		// 请求转发到jsp页面中输出数据
    		request.getRequestDispatcher("/test/showStudent.jsp").forward(request, response);
    	}
    
    }
    

    showStudent.jsp页面

    <%@page import="java.util.ArrayList"%>
    <%@page import="com.atguigu.pojo.Student"%>
    <%@page import="java.util.List"%>
    <%@ 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>
    <style type="text/css">
    	table{
    		 500px;
    		border: 1px solid red;
    		border-collapse: collapse;
    	}
    	th , td{
    		border: 1px solid red;
    	}
    </style>
    	</head>
    	<body>
    		<%
    			List<Student> stus = (List<Student>) request.getAttribute("stus");
    		%>
    		<table>
    			<tr>
    				<th>编号</th>
    				<th>姓名</th>
    				<th>电话</th>
    				<th>邮箱</th>
    				<th>操作</th>
    			</tr>
    		<% for (int i = 0; i < stus.size(); i++) { %>
    			<%	Student stu = stus.get(i); %>
    			<tr>
    				<td><%=stu.getId() %></td>
    				<td><%=stu.getName() %></td>
    				<td><%=stu.getPhone() %></td>
    				<td><%=stu.getEmail() %></td>
    				<td>修改、删除</td>
    			</tr>
    		<% } %>
    		</table>
    	</body>
    </html>
    

    12、什么是Listener监听器?
    Listener监听器是JavaWeb的三大组件之一,
    三大组件分别是:Servlet程序、Filter过滤器、Listener监听器

    Listener监听器,顾名思义,它监听某个事物状态变化,然后反馈给用户信息。
    1、监听事物状态变化
    2、反馈用户结果

    12.1、ServletContextListener监听器
    ServletContextListener监听器,监听ServletContext对象的创建和销毁。

    ServletContext是在web工程启动的时候创建,在web工程停止的时候销毁

    如何使用ServletContextListener监听器,步骤如下:
    1、编写一个类去实现ServletContextListener监听器接口
    2、到web.xml中去配置监听器

    ServletContextListenerImpl 代码:

    public class ServletContextListenerImpl implements ServletContextListener {
    	/**
    	 * ServletContext对象创建并初始化就马上调用此contextInitialized方法
    	 */
    	@Override
    	public void contextInitialized(ServletContextEvent sce) {
    		System.out.println("ServletContext对象被创建啦啦啦…………");
    	}
    
    	/**
    	 * 当ServletContext对象被销毁之后,就会马上调用contextDestroyed方法
    	 */
    	@Override
    	public void contextDestroyed(ServletContextEvent sce) {
    		System.out.println("ServletContext对象被销毁啦啦啦…………");
    	}
    }
    

    web.xml中的配置:

    <!-- listener标签配置监听器 -->
    <listener>
    	<!-- listener-class配置监听器的全类名 -->
    	<listener-class>com.atguigu.listener.ServletContextListenerImpl</listener-class>
    </listener>
    
  • 相关阅读:
    nodejs MYSQL数据库执行多表查询
    【BZOJ3994】[SDOI2015]约数个数和 莫比乌斯反演
    【BZOJ2693】jzptab 莫比乌斯反演
    【BZOJ2154】Crash的数字表格 莫比乌斯反演
    【BZOJ2242】[SDOI2011]计算器 BSGS
    【BZOJ2005】[Noi2010]能量采集 欧拉函数
    【BZOJ1408】[Noi2002]Robot DP+数学
    【BZOJ2045】双亲数 莫比乌斯反演
    【BZOJ2186】[Sdoi2008]沙拉公主的困惑 线性筛素数
    【BZOJ4176】Lucas的数论 莫比乌斯反演
  • 原文地址:https://www.cnblogs.com/javawxid/p/12812107.html
Copyright © 2020-2023  润新知