JavaWeb-动态页面技术JSP

JavaWeb-动态页面技术JSP

  • 通过了解JSP的历史可以知道JSP的本质就是Servlet,而其中直接写的HTML标签是JSP自动帮我们翻译成java代码从而输出实现的。

JSP脚本

格式 说明 简单讲
<%java代码%> java代码进入servixe()内部 就像是service()内部的代码
<%=java变量或表达式%> 进入service()内部的out.print()页面输出 只能是要输出的内如
<%!java代码%> 成为Servlet的成员内容 成员位置就可以定义方法了

JSP注释

由于JSP既可以写java代码又可以写HTML代码再加上本身的JSP,因此其中有三种代码注释,不同的注释可见范围是不同的。

语言 格式 可见范围
HTML <!-- --> JSP源码、翻译后的Servlet、页面HTML源码
Java 单行//多行/**/ JSP源码、翻译后的Servlet
JSP <%-- --%> 仅JSP源码

JSP运行原理

jsp在第一次被访问时会被Web容器翻译成Servlet
过程:第一次访问 --> hello.jsp --> hello_jsp.java --> 编译运行

JSP指令

  • jsp的指令是指导jsp翻译和运行的命令

page指令

属性最多的指令,指导整个页面特性
格式:<%@page 属性名="" 属性名="" 属性名="" %>

属性 说明
language 可以嵌入的语言,就一个java
pageEncoding jsp文件编码,内部可以包含contentType
contentType 解决乱码,reponse对象中的
session 翻译时是否自动创建session
import 导入java包
errorPage 错误跳转页面
isErrorPage 当前页面是一个错误处理页面

include指令

可以将一个jsp页面包含到另一个jsp页面中
格式:<%@include file="path" %>

taglib指令

在jsp页面中引入标签库(jstl标签库、struts2标签库)
格式:<%@ taglib uri="标签库地址" prefix="前缀"%>


JSP内置/隐式对象(9个)

  • JSP被翻译成servlet后,service()方法中有9个对象被初始化,可以在JSP脚本中直接使用,无需声明
名称 类型 描述
out javax.servlet.jsp.JspWriter 用于页面输出
request javax.servlet.http.HttpServletRequest 得到用户请求信息
response javax.servlet.http.HttpServletResponse 服务器向客户端的回应信息
config javax.servlet.ServletConfig 服务器配置,可以取得初始化参数
session javax.servlet.http.HttpSession 用来保存用户的信息
application javax.servlet.ServletContext 所有用户的共享信息
page java.lang.Object 指当前页面转换后的Servlet类的实例(在普通类中的this)
pageContext javax.servlet.jsp.PageContext JSP的页面容器
exception java.lang.Throwable 表示JSP页面所发生的异常,在错误页中才起作用

总结:
四个域对象request,session,pageContext,application
两个输出:out,response
配置信息,this,异常

四种范围对象

-> ->
pageContext request session application
当前页面有效 同一次请求有效(重定向无效) 同一次会话有效 全局有效(整个项目)

公用的方法

方法 说明
Object getAttribute(String name) 根据属性名,获得属性值
void setAttribute(String name, Object obj) 设置属性值(新增修改)
setAttribute("a", "b") 如果a对象之前不存在,则新建一个a对象
如果a之前已经存在,则将a的值改为b
void removeAttribute(String name) 根据属性名,删除对象

1.request:请求对象;存储“客户端向服务器请求的信息”

常用方法:

方法 介绍
String[] getParameterValues(String name) 根据请求的字段名key(input中的name属性),返回多个字段值value(checkbox)
void setCharacterEncoding(“编码格式“) 设置请求编码(tomcat7以前默认iso-8859-1,8以后utf-8)
getRequestDispatcher(b.jsp").forward(request, response) 请求转发的方式跳转页面A-B
getServerContext() 获取项目的ServletContext对象

2.response:响应对象

常用方法:

方法 介绍
void addCookie(Cookie cookie) 服务端向客户端增加cookie对象
void sendRedirect(String location) thorows IOException 页面跳转的一种方式
void contentType(String type) 设置服务端响应的编码(设置服务端的contentType类型)

3.session:

一个session对应一个client上的cookie。
会话,从开始到结束为一次会话。第一次请求会生成一个session并生成sessionID,将sessionID复制一份存放在client的cookie中与session一一对应。
同一次会话共享一个session

方法 介绍
String getId() 获取ssessionId(JSEESIONID)
boolean isNew() 判断是否是新用户(第一次访问)
void invalidate() 使session失效(退出登录、注销)
void setAttribute()
Object getAttribute()
void setMaxInactiveInterval("s") 设置最大有效非活动时间
int getMaxInactiveInterval() 获取最大有效非活动时间

Cookie():由服务端生成,发送给客户端保存。相当于本地缓存。

作用:提高访问服务端的效率,但是安全性较差。

  • 存在客户端,不是内置对象,使用必须New,不能直接使用
  • 服务器会自动生成一个cookie(name=JESSIONID)并返回给客户端
Cookie:key=value
javax.servlet.http.Cookie
public Cookie(String name, String value)
方法 介绍
String getName() 获取name
String getValue() 获取value
void setMaxAge(int expiry) 最大有效期(秒)

服务端准备给客户端
response.addCookie(Cookie cookie)
页面跳转(转发,重定向)
客户端获取
cookie:request.getCookies()
不能单独获得某一个cookie值,必须一次全部获取

4.application

方法 介绍
String getContextPath() 获取虚拟路径
String getRealPath() 获取绝对路径(虚拟路径相对的绝对路径)

5.config:配置对象(服务器配置信息)

6.page:当前JSP页面对象(相当于java中的this)

7.out:输出对象

向客户端输出文本内容
类型:JspWriter
作用:向客户端输出内容out.write()
细节:out对象输出时先进入out对象的缓冲区,在进入response缓冲区,再由Tomcat引擎打包返回客户端,因此如果当前有多个输出,使用response对象输出的内容先进response缓冲区,即先输出以response输出的内容。
out缓冲区默认8kb 可以设置成0 代表关闭out缓冲区 内容直接写到respons缓冲器

常用方法:

out.println();

out.print();

注意:jsp中println()不会换行,与print()作用相同

8. exception:异常对象

9.pageContext

pageContext对象

  • jsp页面的上下文对象

作用

1、除了通用的三个域对象方法pageContext还可以像其他指定的域中存取数据
setAttribute(String name,Object obj,int scope)
getAttribute(String name,int scope)
removeAttrbute(String name,int scope)
findAttribute(String name) //依次从pageContext域,request域,session域,application域中获 取属性,在某个域中获取后将不在向后寻找

2、可以获得其他8大隐式对象
例如
pageContext.getRequest()
pageContext.getSession()

使用pageContext对象向其他域对象中存取值

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%	
		// 向pageContext域中存值
		pageContext.setAttribute("username", "小红帽");
		// 取值输出
		response.getWriter().write((String)pageContext.getAttribute("username"));
		// 向request域中存值
		pageContext.setAttribute("username", "大红帽",PageContext.REQUEST_SCOPE);
		// 向session域中存值
		pageContext.setAttribute("username", "小蓝帽",PageContext.SESSION_SCOPE);
		// 向application域中存值
		pageContext.setAttribute("username", "小黄帽",PageContext.APPLICATION_SCOPE);
	%>
	// 分别输出
	<%=pageContext.getAttribute("username")%>
	<%=pageContext.getAttribute("username", PageContext.REQUEST_SCOPE)%>
	<%=pageContext.getAttribute("username", PageContext.SESSION_SCOPE)%>
	<%=pageContext.getAttribute("username", PageContext.APPLICATION_SCOPE)%>
	<br>
	<%=pageContext.findAttribute("username") %>
	
</body>
</html>

include指令引入其他页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%@include file="header.jsp" %>
	内容
	<%@include file="footer.jsp" %>
</body>
</html>

错误跳转

<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" session="true" errorPage="error.jsp"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		session.setAttribute("name", "张三");
		ArrayList<String> arr = new ArrayList<String>();
		int y = 1/0;
	%>
</body>
</html>

使用Servlet输出简单网页

package com.oracle.web;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TestServlet extends HttpServlet {
	/**
	 * 使用Servlet输出html标签
	 */
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=UTF-8");
		response.getWriter().write("<html>");
		response.getWriter().write("<head>");
		response.getWriter().write("<title>百度一下,你就知道</title>");
		response.getWriter().write("</head>");
		response.getWriter().write("<body>");
		response.getWriter().write("<a herf='https://www.baidu.com'>跳转到百度</a>");
		response.getWriter().write("</body>");
		response.getWriter().write("</html>");
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}
posted @ 2020-05-16 23:12  于大宝执剑江湖  阅读(380)  评论(0)    收藏  举报