JSP概述

news2024/11/27 6:15:41

JSP

JSP是Sun为了解决动态生成HTML文档的技术,通过Servlet输出简单html页面信息都非常不方便。如果要输出一个复杂页面的时候,就更加的困难,而且不利于页面的维护和调试。所以sun公司推出一种叫做jsp的动态页面技术来实现对页面的输出繁锁工作。JSP就是替代Servlet输出HTML的

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<table>
<%
for(int i=1;i<10;i++){
out.println("<tr>");
for(int k=1;k<=i;k++){
%>
<td><%=k%>*<%=i%>=<%=i*k%></td>
<% }
out.println("</tr>");
}
%>
</table>
</body>
</html>

JSP技术最大的特点在于写JSP就像在写html,但是相比html而言,html只能为用户提供静态数据,而
JSP技术允许在页面中嵌套 java 代码,为用户提供动态数据。

核心运行原理

JSP执行需要有二次编译,生成的类继承于HttpJspBase类,这是一个jsp文件生成Servlet程序要继承的基类。这个HttpJspBase类继承于HttpServlet类。

  • 当jsp页面第一次被访问时【不访问则不会自动编译】,首先由服务器进行定位,如果不存在则404
    • 如果使用过程中发现修改则自动会触发重新编译加载
  • 如果存在,则使用jsp引擎将jsp页面文件转换为servlet类文件[index.jsp–>index_jsp.java,包名称
    为org.apache.jsp]
  • 如果编译失败,则运行报错【500】,否则继续调用servlet引擎将Servlet类文件编译转换为字节码文件[index_jsp.java–>index_jsp.class]
  • 然后加载初始化类文件【反射–无参构造器,事实上由于java文件是jsp引擎生成的,所以类名称无
    法确定】
<%!
public index_jsp(){} //语法报错
%>
  • 三生命周期

三生命周期

public void _jspInit() { 在构造完成后自动执行初始化操作,在整个jsp生命周期过程中执行
且只执行一次
}
public void _jspDestroy() { 在jsp页面对象销毁前自动执行的资源回收方法,在整个jsp生命
周期过程中执行且只执行一次
}
public void _jspService(final javax.servlet.http.HttpServletRequest request,
final javax.servlet.http.HttpServletResponse response) throws
java.io.IOException, javax.servlet.ServletException { 用于对客户端的请求进行响
应,jsp默认单实例多线程的方式,执行响应结束后常驻内存
if
(!javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
final java.lang.String _jspx_method = request.getMethod();
if ("OPTIONS".equals(_jspx_method)) {
response.setHeader("Allow","GET, HEAD, POST, OPTIONS");
return;
}
if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) &&
!"HEAD".equals(_jspx_method)) {
response.setHeader("Allow","GET, HEAD, POST, OPTIONS");
response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSP
只允许 GETPOSTHEAD。Jasper 还允许 OPTIONS");
return;
}
}
final javax.servlet.jsp.PageContext pageContext;
javax.servlet.http.HttpSession session = null;
final javax.servlet.ServletContext application;
final javax.servlet.ServletConfig config;
javax.servlet.jsp.JspWriter out = null;
final java.lang.Object page = this;
javax.servlet.jsp.JspWriter _jspx_out = null;
javax.servlet.jsp.PageContext _jspx_page_context = null;
try {
response.setContentType("text/html;charset=UTF-8");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
out.write("\r\n");
out.write("\r\n");
out.write("<html>\r\n");
out.write("<head>\r\n");
out.write(" <title>Title</title>\r\n");
out.write("</head>\r\n");
out.write("\r\n");
out.write("<body>\r\n");
out.write("您是第");
out.print(counter++);
out.write("位访客!\r\n");
out.print(request.getRealPath(""));
out.write("\r\n");
out.write("</body>\r\n");
out.write("</html>\r\n");
} catch (java.lang.Throwable t) {
if (!(t instanceof javax.servlet.jsp.SkipPageException)){
out = _jspx_out;
if (out != null && out.getBufferSize() != 0)
try {
if (response.isCommitted()) {
out.flush();
} else {
out.clearBuffer();
}
} catch (java.io.IOException e) {}
if (_jspx_page_context != null)
_jspx_page_context.handlePageException(t);
else throw new ServletException(t);
}
} finally {
_jspxFactory.releasePageContext(_jspx_page_context);
}
}

注意:jsp 或者 servlet默认采用的是单实例多线程的方式对外提供服务,一个用户请求启动一个线程
如果需要使用多实例单线程的方式

  • servlet实现特定的标识接口 public class TestServlet extends HttpServlet implements SingleThreadModel
  • jsp在page指令中添加属性配置 isThreadSafe=“false” ,默认值为true
<%@ page contentType="text/html;charset=UTF-8" language="java" isThreadSafe="false" %>

自动生成的类文件

public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent,
org.apache.jasper.runtime.JspSourceImports,
javax.servlet.SingleThreadModel {

动态网页的相关技术

  • CGI通用网关接口,C语言编程实现,早期版本针对一个用户启动一个进程。Sun针对CGI的缺点提出了Servlet,单实例多线程的运行方式
  • JSP:Java平台,安全性高,适合开发大型的,企业级的,分布式的Web应用程序。如Hadoop、电子银行、12306等
  • ASP.net即.Net平台,简单易学。但是安全性以及跨平台型差
  • PHP:简单,高效,成本低开发周期短,特别适合中小型企业的Web应用开发。(LAMP:Linux +Apache + MySQL + PHP)

Jsp和Servlet的关系

jsp和Servlet都是SUN公司针对动态网页开发提出的技术,基本上两者之间可以相互替代,jsp 究其本质就是servlet,因为jsp的二次编译的第一次就是将jsp转换为servlet。

  • jsp是包含Java代码的html网页
  • Servlet是包含Html代码的java类

具体的开发中一般采用jsp页面实现数据的现实和收集客户动作,采用Servlet进行流程控制

语法基础

模板元素:

  • 直接写在jsp页面的html内容称之为jsp页面的模板元素;
  • 模板元素在翻译过来的servlet中被out.write()原样输出到浏览器中

添加java代码的方法:

  • <% 合法的java程序; %> 对应Servlet中_jspService方法体内。类(T 内部类) 方法(F) 属性(F)
    • JSP脚本片段 <% 若干Java语句;%>
  • <%=表达式%> 注意表达式末尾没有;收尾。对应Servlet中 _jspService 方法体内的out.print(表达
    式);这个语句。类(T 匿名内部类) 方法(F) 属性(F)
    • JSP表达式 --取值
    • 常量 : <%=“hello”%>
    • 变量 :<%String name=“aa”%> //定义变量
      <%=name%> //取变量的值
    • 表达式: <%=100+123%> <%=request.getContextPath()%>
  • <%! 声明部分; %> 对应Servlet中所有的方法之外类内部分。类(T 内部类) 方法(T) 属性(T)

jsp中的注释

  • 多行html注释: <!-- --> 其中的合法的jsp语法要素继续执行,但是不显示执行效果。例如 <!-- 今 天是<%=new Date()%> --> 如果注释中有不合法的jsp语句,仍旧会出5xx的报错
  • 多行jsp注释 <%-- --%> 将会被编译器所忽略
  • 另外在 <% %> 其中Java注释仍旧有效,例如 // /* */ /** */

JSP三大指令

页面指令

page 指令用于定义 JSP 页面的各种属性。page属性很多,常用的属性有 import、language、
pageEncoding 等

语法格式 <%@ page language="java" contentType="text/html; charset=UTF-8" %>

  • language属性值只能是 java,表示脚本语言使用的是 java 语言的
  • contentType设置响应头contentType的内容
response.setContentType("text/html;charset=utf-8"); 响应内容类型用于告知浏览器如何
处理服务器生成的响应流。遵循MIME【多用途互联网邮件扩展协议】协议标准
text/html、image/jpeg,其它可以在服务器的web.xml中进行查询

<mime-mapping>
<extension>rip</extension> 文件扩展名
<mime-type>audio/vnd.rip</mime-type> 对应的MIME格式串的写法
</mime-mapping>
  • pageEncoding设置当前jsp页面的编码

从字面含义上相互之间没有任何关系,实际应用中可以相互替代

  • import 给当前 jsp 页面导入需要使用的类包。注意一般的全局配置属性只能出现一次,但是
    import允许多次
<%@ page import="java.util.*,java.io.*" %>
<%@ page import="java.text.DateFormat" %>
  • autoFlush设置是否自动刷新out的缓冲区,默认为true
  • buffer设置out的缓冲区大小。默认为8KB,关闭缓冲区可以使用none
  • errorPage设置当前 jsp 发生错误后,需要跳转到哪个页面去显示错误信息
  • isErrorPage设置当前 jsp 页面是否是错误页面。true就可以使用默认exception异常对象
默认情况下,在jsp的脚本段代码中不需要针对受检型异常进行处理,jsp页面有自己的异常处理方法

在jspService中包含了try{} catch(Throwable t){}

可以在页面中指定对应的异常处理页面 <%@ page errorPage="err.jsp"%>

如果在err.jsp中需要获取原始页面中的异常对象,则需要在err.jsp中设置当前页是异常处理页 <%@
page isErrorPage="true"%> ,err.jsp中可以通过9大默认对象中的exception对象获取异
常<%=exception %>

注意:如果需要使用9大默认对象中的exception对象,则当前页面必须设置isErrorPage=true,
否则null

web.xml

<error-page> 专门只针对错误状态码进行定义显示页面,例如404403<error-code>404</error-code>
<location>/err404.html</location>
</error-page>
人为产生错误响应状态的方法 response.sendError(int,String)
<error-page> 应用全局异常处理
<exception-type>java.lang.Exception</exception-type>
<location>/err.jsp</location>
</error-page>
  • session设置当前 jsp 页面是否获取session对象,默认true。值false则不能直接使用 session对象
<%@ page language="java" session="false"%>
<%=session%>IDE工具中语法报错
  • extends给服务器厂商预留的 jsp 默认翻译的 servlet 继承于什么类
  • isThreadSafe默认true表示单实例多线程运行方式,false则实现线程安全接口
    SingleThreadModel,含义和实现是反的,所以相当长时间里是考核重点。

静态包含指令

静态包含指令用于引入其它JSP文件。使用include指令引入的其它JSP文件,JSP引擎将把这两个JSP文件翻译成一个servlet,所以include称为静态包含

静态包含<%@ include file="" %>是把包含的页面内容原封装不动的输出到包含的位置。

  • 能包含当前应用中的内容
  • 不能使用参数,也不允许使用变量指定file内容

web页面之间的相互关系:

  • 包含,包含可以分为静态包含和动态包含
  • 请求转发
  • 重定向

标签库指令

taglib标签库用于在 JSP 页面中导入标签库,例如JSP标准标签库、第三方标签库、自定义标签库。

JSP六大动作

JSP动作是一组JSP内置的标签,只书写少量的标记代码就能够使用JSP提供丰富的功能,JSP行为动态是对常用的JSP功能的抽象和封装。

JSP Actions是使用xml语法写的,是 jsp 规定的一些列标准动作,在容器处理 jsp 时,当容器遇到动作元素时,就执行相应的操作。

JSP共有以下6种基本动作

  • jsp:include:在页面被请求的时候引入一个文件。
  • jsp:useBean:寻找或者实例化一个JavaBean。
  • jsp:setProperty:设置JavaBean的属性。
  • jsp:getProperty:输出某个JavaBean的属性。
  • jsp:forward:把请求转到一个新的页面。
  • jsp:plugin:根据浏览器类型为Java插件生成OBJECT或EMBED标记。

动态包含

动态包含 <jsp:include page="relativeURL|<%=expressicry%>"></jsp:include> 动态引入另一个文件,其中动态包含会把包含的 jsp 页面单独翻译成servlet文件,然后在执行到时候再调用翻译的servlet程序。并把计算的结果返回。动态包含是在执行的时候才会加载。所以叫动态包含

  • 静态包含是包含源代码
  • 动态包含是包含执行结果
    request.getRequestDispatcher("dd.jsp").include(request,response)

page参数

  • 可以使用变量
  • 只能包含当前应用中的资源
<jsp:include page="err.jsp">
<jsp:param value="99" name="id"/>
</jsp:include>
http://localhost:8080/20221122/index.jsp?id=100&name=zhangsan
注意在被包含页面中可以通过parameter接收参数

重点:静态包含和动态包含的区别

静态包含动态包含
是否生成java文件不生成生成
service方法中的区别把包含的内容原封拷贝到service中JspRuntimeLibrary.include方法
是否可以传递参数没有必要,因为就是同一个文件可以
编译次数1包含的文件+1,可以包含需要传递参数

实际工作中几乎都是使用静态包含。因为 jsp 页面虽然可以写 java 代码做其他的功能操作。但是由于jsp在开发过程中被定位为专门用来展示页面的技术。也就是说jsp 页面中,基本上只有 html、css、js。还有一些简单EL表达式脚本等输出语句。所以都使用静态包含

请求转发

请求转发 <jsp:forward> 转发功能相当于request.getRequestDispatcher(“”).forward(request,
response); 的功能。
基础语法 <jsp:forward page="跳转的jsp页面"> [<jsp:param name="" value=""/>] [<jsp:param name="" value=""/>] </jsp:forward>

重定向 response.sendRedirect

  • 是否共享request
  • 是否客户端参与

html转发
2秒后刷新页面:

<meta http-equiv="Refresh" content="3" /> 

3秒之后跳转页面:

<meta http-equiv="Refresh" content="3;url=http://www.baidu.com" />

javaBean的使用

JavaBean是一个遵循特定写法的Java类,它通常具有特点:

  • 这个Java类必须具有一个无参的构造函数
  • 属性必须私有化
  • 私有化的属性必须通过public类型的方法暴露给其它程序,并且方法的命名也必须遵守一定的命名
    规范
public class Student{
public Student(){} 自定义无参构造器和系统默认提供的都可以
private String name;
public String getName(){return this.name;} //名称必须正确,注意大小写
public void setName(String name){this.name=name; }
}

<jsp:useBean> 用于在指定的域范围内查找指定名称的JavaBean对象。

  • 如果在指定的范围已经存在该 bean 实例,那么将使用这个实例,而不会重新创建。
  • 如果不存在则实例化一个新的JavaBean对象并将它以指定的名称存储到指定的域范围中。;

相关属性

  • id命名引用该Bean的变量。如果能够找到id和scope相同的Bean实例,jsp:useBean动作将使用已
    有的Bean实例而不是创建新的实例
  • class指定Bean的完整包名,如果存在则复用,如果不存在则InstantiationException
  • scope指定Bean在哪种上下文内可用,可以取下面的四个值之一:page,request,session和
    application。默认值是page,表示该Bean只在当前页面内可用(保存在当前页面的PageContext
    内)。request表示该Bean在当前的客户请求内有效(保存在ServletRequest对象内)。session
    表示该Bean对当前HttpSession内的所有页面都有效。最后,如果取值application,则表示该Bean对所有具有相同ServletContext的页面都有效

因为jsp:useBean只有在不存在具有相同id和scope的对象时才会实例化新的对象;如果已有
id和scope都相同的对象则直接使用已有的对象,此时jsp:useBean开始标记和结束标记之间
的任何内容都将被忽略

  • type 指定引用该对象的变量的类型,它必须是Bean类的名字、超类名字、该类所实现的接口名字
    之一。请记住变量的名字是由id属性指定的
  • beanName指定Bean的名字。如果提供了type属性和beanName属性,允许省略class属性

<jsp:useBean id="dd" class="java.util.Date" scope="request"/> 首先在request中查找名称
为dd的日期类型变量,就是request.getAttribute(“dd”),如果获取不到,则新建Date变量,并存放在
request中,名称就是id的值

设置bean属性

<jsp:setProperty name="对象" property="属性" value="属性值"/> 给一个 javaBean 实例属性赋

典型应用1:

<form action="bb.jsp" method="post">
	<input name="username"/><input name="password"/><input name="age"/>
	<input type="submit" value="提交数据"/>
</form>

定义值bean【DTO、DAO、BO、VO】

public class Student{
private String usenrame;
private String password;
private Integer age;
//对应的get/set方法,注意命名规则
}

在bb.jsp页面中接收数据,注意 * 的用法

<jsp:useBean id="student" class="com.yan.entity.Student" scope="request">
<jsp:setProperty name="student" property="*"/> 可以直接从request的
parameter中接收请求参数,按照名称对应的方法设置到student对象中,如果需要则自动进行数据类型转换。
</jsp:useBean>

如果名称不一致可以使用setProperty进行设置

<!-- student.setUsenrname(request.getParameter("username")) -->
<jsp:setProperty name="student" property="usenrame" param="username"/>

允许给值bean属性设置具体的数据

<% int ss=18; %>
<jsp:setProperty name="student" property="age" value="<%=ss%>"/>

获取bean属性值

<jsp:getProperty property="" name=""/> 取得一个 javaBean 实例的成员变量,在当前位置输出
指定对象的某个属性值

使用中的注意事项

<% request.setCharacterEncoding("UTF-8");
Student student=new Student();
session.setAttribute("student",student);
%>
<jsp:useBean id="student" class="com.yan.entity.Student"> 语法报错,因为临时变量
student和useBean的id值相同
<jsp:setProperty name="student" property="*"/>
</jsp:useBean>

使用useBean创建的对象可以当作临时变量使用

<jsp:useBean id="student" class="com.yan.entity.Student">
<jsp:setProperty name="student" property="*"/>
</jsp:useBean>
<%=student%>

插件

<jsp:plugin code="" codebase="" type="bean"></jsp:plugin> 是执行一个applet或Bean,有
可能的话还要下载一个Java插件用于执行它。基本已经不再使用

<jsp:plugin type=applet code="Molecule.class" codebase="/html">
<jsp:params>给插件添加参数
<jsp:param name="molecule" value="molecules/benzene.mol" />
</jsp:params>
<jsp:fallback>当applet或者bean不能正常执行时显示的内容
<p>Unable to load applet</p>
</jsp:fallback>
</jsp:plugin>

JSP九大隐式对象

介绍: 可以在JSP页面直接使用这九大对象

  • page this
  • request ServletRequest
  • response ServletResponse
  • application ServletContext
  • session HttpSession
  • config ServletConfig
  • exception 异常信息的对象
  • out 等价于response.getWriter()
  • pageContext PageContext

1、request对象是javax.servlet.HttpServletRequest类型的对象。该对象代表了客户端的请求信息,主
要用于接受通过HTTP协议传送到服务器的数据。(包括头信息、系统信息、请求方式以及请求参数
等)。request对象的作用域为一次请求。

  • getParameter/getParameterNames/getParameterMap/getParameterValues
  • getAttribute/setAttribute/removeAttribute
  • getHeader/getIntHeader/getDateHeader
  • getRemoteAddr/getLocalAddr
  • getRequestURI/getRequestURL
  • getReader/getInputStream

2、response对象是HttpServletResponse类型的对象,代表的是服务器对客户端的响应,主要是将JSP容器处理过的对象传回到客户端。response对象也具有作用域,它只在JSP页面内有效。

  • response.sendRedirect/sendError
  • reset/resetBuffer
  • setContentType
  • addHeader/addDateHeader/addIntHeader – setHeader/setDateHeader/setIntHeader
  • getWriter/getOutputStream

3、out 对象是一个输出流,用来向客户端输出数据,可以是各种数据类型的内容,同时,它还可以管理应用服务器上的输出缓冲区,缓冲区的默认值是 8KB,可以通过页面指令 page 来改变默认大小。out对象是一个继承自抽象类 javax.servlet.jsp.JspWriter 的实例,在实际应用中,out 对象会通过 JSP 容器变换为 java.io.PrintWriter 类的对象。(可以简单理解:JspWriter就是带缓存的PrintWrieter)

  • 相当于response.getWriter
  • print/println/write
  • getBufferSize()/out.getRemaining()/flush
  • close/clear/clearBuffer
  • append/newLine()

只有向out对象中写入了内容,且满足如下任何一个条件时,out对象才去调用ServletResponse.getWriter方法,并通过该方法返回的PrintWriter对象将out对象的缓冲区中的内容真
正写入到Servlet引擎提供的缓冲区中:1、设置page指令的buffer属性关闭了out对象的缓存功能或主动调用flush()方法刷新缓冲区。2、out对象的缓冲区已满。3、整个JSP页面结束

<%
out.println("xxxx"); 理论上来说应该是先输出xxxx,再输出111111。但是实际上执行的结果为
先输出111111,然后输出xxxx
response.getWriter().println("11111");
%>

out流和writer流的两个缓冲区
在这里插入图片描述
4、application对象是ServletContext类型对象,用于保存应用程序的公用数据,服务器启动并自动创
建application对象后,只要没有关闭服务器,application对象就一直存在,所有用户共享application对
象。

<context-param>
<param-name>abc</param-name>
<param-value>1234</param-value>
</context-param>
  • 读取数据的方法 application.getInitParameter(“anc”):String
    • getParameterNames():Enumeration
  • application.log使用系统日志记录特定信息
  • getAttribute/setAttribute/removeAttribute
  • getResourceAsStream
  • 针对注解开发的支持方法
    • addListener/addServlet/addFilter

注意: application对象可以实现跨用户数据共享,所以修改数据时需要考虑线程安全问题

5、session对象是HttpSession类型的对象,作用域一次会话的所有页面之间,只要保持同一会话,把
一个键值对设置到session中,无论跳转到哪个页面都可以取到session中的键值对。

  • getAttribute/setAttribute/removeAttribute
  • invalidate() / getId()
  • 获取session的方法 request.getSession()
  • isNew()/getLastAccessedTime/setMaxInactiveInterval/getMaxInactiveInterval

相关配置web.xml

<session-config>
<session-timeout>30</session-timeout>
</session-config>

session的激活钝化机制

  • 存储到session中的数据要求Serializable

6、config 对象是 javax.servlet.Servlet类的实例,表示 Servlet 的配置信息。

jsp配置初始化参数 web.xml

<servlet>
<servlet-name>bb</servlet-name>
<jsp-file>/bb.jsp</jsp-file>
<init-param>
<param-name>rows</param-name>
<param-value>1234</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>bb</servlet-name>
<url-pattern>/bb.do</url-pattern>
</servlet-mapping>

jsp中使用 config对象

<%!
private int rowsPerPage=15;
public void jspInit(){
this.getServletConfig().getInitParameter("rows");
}
%>
<%
//在jspService中获取初始化参数的问题是:线程安全问题,可以使用synchronized(this)
{}
String ss=config.getInitParameter("rows");
if(ss!=null && ss.trim().length()>0){
try{
this.rowsPerPage=Integer.parseInt(ss.trim());
} catch(Exception e){
this.rowsPerPage=15;
}
}
%>

针对jsp进行映射配置后,则不能再使用原始的访问方式,否则配置参数无效。例如这里的bb.jsp不能再使用,使用则不能读取到rows参数配置,只能通过映射路径bb.do进行访问

  • config.getInitParameter(“rows”)
  • getInitParameterNames():Enumeration
  • getServletContext():ServletContext
  • getServletName()
  • 如果需要凑齐5个方法,可以考虑toString之类的Object中的方法

7、page 对象是为了执行当前页面应答请求而设置的 Servlet类的实体,即显示 JSP页面自身,与类的
this 指针类似,使用它来调用 Servlet 类中所定义的方法,只有在本页面内才是合法的。它是
java.lang.Object 类的实例

<%! int counter=0;%> 定义属性
<%=this.counter%> this用于指代当前页面对象,可以直接访问属性
<%=page.counter %> 语法错误,因为page是Object类型,Object中没有counter属性
  • hashCode
  • equals
  • wait
  • notify
  • toString

8、exception对象是java.lang.Throwable 的实例,该实例代表其他页面中的异常和错误。只有当页面
是错误处理页面,即编译指令page 的isErrorPage 属性为true 时,该对象才可以使用。常用的方法有
getMessage()和printStackTrace()等

在jsp页面中使用exception对象的前提是isErrorPage=true

有可能出现异常的页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
errorPage="err.jsp"%>
<% int k=0; out.println(10/k); %>

异常处理页中一般并不使用exception获取异常信息,只要在开发阶段需要输出异常的详细信息

  • toString()
  • getMessage() / getLocalizedMessage()
<%@ page language="java" contentType="text/html; charset=UTF-8"
isErrorPage="true"%>
<%exception.printStackTrace(response.getWriter());%>

解决方案2:

<%@ page language="java" contentType="text/html; charset=UTF-8"
isErrorPage="true"%>
<%exception.printStackTrace(new PrintWriter(out));%>

9、pageContext对象是PageContext抽象类型的JSP技术中最重要的一个对象,它代表JSP页面的运行环境,这个对象不仅封装了对其它8大隐式对象的引用,它自身还是一个域对象,可以用来保存数据。并且,这个对象还封装了web开发中经常涉及到的一些常用操作,例如引入和跳转其它资源、检索其它域对象中的属性等。

PageContext 为页面/组件作者和页面实现者提供了许多工具,其中包括:1、管理各种范围名称空间的单个API。2、许多便捷API用于访问各种公共对象。获取 JspWriter 以供输出的机制、通过页面管理会话使用的机制。3、向脚本环境公开页面指令属性的机制。4、将当前请求转发或包含到应用程序中其他活动组件的机制。5、处理 errorpage 异常处理的机制

pageContext

代表当前JSP页面的运行环境的对象;

可以通过他获取其他八大隐式对象,例如:pageContext.getPage()

<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%
ServletRequest req=pageContext.getRequest();//request
ServletResponse resp=pageContext.getResponse();//response
JspWriter output=pageContext.getOut();//out
ServletConfig cfg=pageContext.getServletConfig();//config
Exception error=pageContext.getException(); //exception
HttpSession sess=pageContext.getSession();//session
ServletContext app=pageContext.getServletContext();//application
Object p=pageContext.getPage(); //page
%>

pageContext 是一个域对象,有生命周期:当访问JSP开始时创建pageConext对象,当访问JSP结束时销毁pageContext对象

作用范围:整个JSP页面

主要功能:在整个JSP页面中实现数据的共享

方法: 使用范围为page时不能使用page.setAttribute/getAttribute之类的方法。如果需要操作page范
围的attribute则需要通过pageContext对象提供的方法

  • setAttribute(String name,Object value) ; //添加一个相应的域属性,
    例如:request.setAttribute(“names”,names); //向request域中添加一个属性
  • getAttribute(String name) ;
  • removeAttribute(String name);//删除该属性

存储数据会涉及4大域对象,其对应的生命周期从大到小:ServetContext 【application】 >
HttpSession【session】 > HttpServletRequest【request】 > PageContext【pageContext】

<%
request.setAttribute("now",123456);
session.setAttribute("now",new Date());
out.println(pageContext.findAttribute("now")); 按存储范围从小到大,逐一查找。如果
查找不到则返回null
%>

使用getAttribute同时设定读取数据的范围

out.println(pageContext.getAttribute("now", PageContext.PAGE_SCOPE)); 相当于
pageContext.getAttribute("now")
out.println(pageContext.getAttribute("now",PageContext.SESSION_SCOPE)); 相当于
session.getAttribute("now")

跳转页面 pageContext.forward("test.jsp"); 请求转发
页面包含 pageContext.include("test.jsp"); 动态包含

request

网络答题

<FORM action="answer.jsp" method=post name=form>
<P>诗人李白是中国历史上哪个朝代的人:
<INPUT type="radio" name="R" value="a">宋朝
<INPUT type="radio" name="R" value="b">唐朝
<INPUT type="radio" name="R" value="c">明朝
<INPUT type="radio" name="R" value="d" checked="ok">元朝<BR>
<P>小说红楼梦的作者是:
<INPUT type="radio" name="P" value="a">曹雪芹
<INPUT type="radio" name="P" value="b">罗贯中
<INPUT type="radio" name="P" value="c">李白
<INPUT type="radio" name="P" value="d">司马迁
<INPUT TYPE="submit" value="提交答案" name="submit">
</FORM>
<%
int n=0;
String s1=request.getParameter("R");
String s2=request.getParameter("P");
if(s1==null)
s1="";
if(s2==null)
s2="";
if(s1.equals("b"))n++;
if(s2.equals("a"))n++;
%>
<P>您得了<%=n%>

表结构如何定义:针对标准化考试,4个选项,单选

create table tb_question(
id bigint primary key auto_increment,
quest varchar(50) not null,
ach varchar(50) not null,
bch varchar(50) not null,
cch varchar(50) not null,
dch varchar(50) not null,
ans char(1) default 'a'
)engine=innodb default charset utf8;

response

response对象的setContentType方法

将当前页面保存为word文档吗?
<FORM action="" method="get" name=form>
<INPUT TYPE="submit" value="yes" name="submit">
</FORM>
<%
String str=request.getParameter("submit");
if(str==null)str="";
if(str.equals("yes"))
response.setContentType("application/msword;charset=GB2312");
%>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/27203.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

四维轻云地理空间数据协作管理平台的使用流程介绍

倾斜摄影模型和点云数据采集制作完成后&#xff0c;很多行业在进行数据查看管理和共享时具有很大的不便&#xff0c;通常需要依赖专业软件才能在电脑上进行浏览&#xff0c;倘若想将数据分享给他人查看&#xff0c;则需要进行大文件传输以及让对方安装专业软件。现如今&#xf…

年薪百万的程序员,上网都在看什么?

这个问题相信不少人都好奇&#xff0c;我揪出一位年薪百万的程序员老友&#xff0c;翻遍他的收藏夹&#xff0c;总结整理了6个网站&#xff0c;甩出来给大家。 有几个干货网站大家记得当场保存&#xff0c;要不然划过就忘了&#xff01;&#xff01; 国际各行业报告&#xff1…

python 异步线程 实现 异步生产 同步通信

🍿*★,*:.☆欢迎您/$:*.★* 🍿 目录 背景 正文 总结 背景描述

傅里叶变换的四种形式

此文转自知乎的jinjin 傅里叶变换的四种形式 - 知乎 傅里叶变换是信号的一种描述方式&#xff0c;通过增加频域的视角&#xff0c;将时域复杂波形表示为简单的频率函数&#xff0c;获得时域不易发现的与信号有关的其他特征。 根据时间域信号x自变量的不同&#xff0c;可以将信号…

sqli-labs/Less-45

这一关有没有报错信息 所以我们不能从报错信息中得知注入类型 我们只能通过登陆成功或者失败去辨别我们判断的注入类型正确与否 然后我们也不懂注入点 所以只能进行尝试了 如果两个参数在SQL语句中都被单引号包裹住 那么假设username为注入点输入如下 username admin# pass…

【强大的数据迁移和恢复解决方案】KernelApps及其产品介绍

KernelApps是 范围广泛的强大的数据迁移和 恢复解决方案 可以根据用户的需求提供多种采购方案 KernelApps提供 交换服务器、Office 365、 电子邮件迁移、Outlook等方面工具 其产品包括数据恢复、文件修复、 数据迁移、电子邮件迁移、 媒体恢复、云备份、云迁移等解决方…

基于32单片机的多功能电子语音时钟

本设计是32单片机的多功能电子语音时钟设计&#xff0c;主要实现以下功能&#xff1a; 1.通过OLED显示时间&#xff0c;日期&#xff0c;温度&#xff0c;湿度等信息 2.到达整点时能够语音播报时间和温湿度 3.可通过按键使语音模块播报时间和温湿度 4.可通过按键调整当前时间&…

Mac M1安装Centos8

M1 芯片 Centos8 百度网盘下载的慢&#xff0c;大家可以直接给我留言&#xff0c;我用奶牛快传分享给大家 链接: https://pan.baidu.com/s/1gT7TnBk5HnT27F82FGht7w?pwd1234 提取码: 1234 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 安装 第一次输入 r 依…

推荐一款高效率前端开发神器,功能太强大了

当前端收到一张设计稿的时候&#xff0c;他们需要考虑非常多的问题。 而第一个摆在面前的问题就是 - 切图。作为连接设计师和前端的重要“纽带”&#xff0c;如果切图不准确&#xff0c;很容易导致最终的产品呈现与设计稿大相径庭。 随之而来的第二个问题就是 - 设计还原。页面…

荧光标记转铁蛋白-(FITC, cy3, cy5, cy7, 香豆素, 罗丹明)

转铁蛋白&#xff08;Tf&#xff09;结合铁是通过与其受体&#xff0c;即Transferrin Receptor 1(TfR1)相互作用而实现的。TfR1 是一种表达于细胞表面的糖蛋白&#xff0c;由两个同源二聚体的亚基通过二硫键连接而成。在细胞表面&#xff0c;Tf与Fe3相互作用形成全铁-Tf&#x…

ESP32 入门笔记07: ESP-NOW (ESP32 for Arduino)

【B站乐鑫】 ESP-NOW 无线通信方案简介 ESP-NOW 是一种快速、无连接的通信技术&#xff0c;具有短数据包传输的特点。 ESP-NOW 是乐鑫开发的一种“协议”&#xff0c;它使多个设备无需使用 Wi-Fi 即可相互通信。该协议类似于低功耗 2.4GHz 无线连接 。在通信之前需要设备之间…

什么是数字孪生?数字孪生技术有没有真正的实用价值?

可以很确定地说&#xff0c;数字孪生技术为我们的生活与工作都提供了巨大的价值。过去几年&#xff0c;在经历了”三起三落”之后&#xff0c;数字孪生再次成为资本和舆论关注的焦点。“数字孪生就像是给你了一个水晶球&#xff0c;能够根据过去和当下发生的事情来预测并模拟未…

HDMI接口类型种类区分图(高清图)

HDMI接口类型这么多种啊&#xff0c;主要有A、B、C、D、E五种类型。 1、A类&#xff08;Type A&#xff09; HDMI A Type是使用最广泛的HDMI线缆&#xff0c;HDMI A接口共有19pin&#xff0c;宽度为13.9毫米&#xff0c;厚度为4.45毫米。 2、B类&#xff08;Type B&#xff…

【SpringCloud】04 网关springcloud gateway

网关springcloud gateway 上面的架构&#xff0c;会存在着诸多的问题&#xff1a; 客户端多次请求不同的微服务&#xff0c;增加客户端代码或配置编写的复杂性 认证复杂&#xff0c;每个服务都需要独立认证。 存在跨域请求&#xff0c;在一定场景下处理相对复杂。 网关可以做…

【QT】编译QtWebEngine(Build QtWebEngine from source)Win10+QT5.7.1_x64+VS2015

1、前言 关于QtWebEngine是干什么的&#xff0c;怎么用的&#xff0c;不在此赘述。 1.1、为什么要编译QtWebEngine QT默认的QtWebEngine是不支持mp3、mp4解码的&#xff0c;也就是说&#xff0c;如果想要在QT浏览网页的时候支持在线播放音视频&#xff0c;就需要让QtWebEngi…

前端品优购项目准备工作

网站制作流程&#xff1a; 初稿审核&#xff1a;网页美工会制作原型图和psd效果图 品优购项目规划&#xff1a; 1 品优购项目整体介绍 描述&#xff1a;电商网站&#xff0c;要完成PC端首页&#xff0c;列表页&#xff0c;注册页面的制作 2 品优购项目学习目的 电商类网站比…

nRF Connect for Desktop[自己的APP环境搭建]

本文源码仓库地址:https://github.com/NordicSemiconductor/pc-nrfconnect-ble/blob/main/package.json nRF Connect for Desktop是nordic自己做的一个PC端的蓝牙工具,配合nordic的dongle可以实现蓝牙的很多功能,要浏览本文要有如下知识储备: 1.nRF Connect for Desktop的APP是…

ELFK集群部署与Logstash的过滤模块

ELFK集群部署与Logstash的过滤模块ELFK集群部署与Logstash的过滤模块一、ELFK集群部署&#xff08;FilebeatELK&#xff09;Filebeatfilebeat 结合 logstash 带来好处&#xff1a;1.1 部署ELK集群1.2 安装Filebeat&#xff08;Apache节点&#xff09;1.3 设置 filebeat 的主配置…

TimeSformer:Is Space-Time attention all you need for video understanding?

【实践】CV领域的Transformer模型TimeSformer实现视频理解 - 飞桨AI Studio本项目选取CV中的transformer模型TimeSformer进行项目开发&#xff0c;在UCF101数据集上训练、验证、评估 - 飞桨AI Studiohttps://aistudio.baidu.com/aistudio/projectdetail/3413254?contributionT…

Zookeeper系列文章-Curator

之前我们讲解了Zookeeper安装与Zookeeper常用命令讲解 linux安装Zookeeper3.5.7详解_兜兜转转m的博客-CSDN博客 Zookeeper系列文章—入门_兜兜转转m的博客-CSDN博客 由于我们需要利用Java进行开发&#xff0c;因此我们使用Curator对Zk进行操控 导入依赖&#xff0c;由于使用…