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);
}
}

浙公网安备 33010602011771号