JSP是Sun为了解决动态生成HTML文档的技术,通过Servlet输出简单html页面信息都非常不方便。如果要输出一个复杂页面的时候,就更加的困难,而且不利于页面的维护和调试。所以sun公司推出一种叫做jsp的动态页面技术来实现对页面的输出繁锁工作。JSP就是替代Servlet输出HTML的
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
Insert title here
<%
for(int i=1;i<10;i++){
out.println("");
for(int k=1;k<=i;k++){
%>
<%=k%>*<%=i%>=<%=i*k%>
<% }
out.println(" ");
}
%>
JSP技术最大的特点在于写JSP就像在写html,但是相比html而言,html只能为用户提供静态数据,而
JSP技术允许在页面中嵌套 java 代码,为用户提供动态数据。
JSP执行需要有二次编译,生成的类继承于HttpJspBase类,这是一个jsp文件生成Servlet程序要继承的基类。这个HttpJspBase类继承于HttpServlet类。
<%!
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
只允许 GET、POST 或 HEAD。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("\r\n");
out.write("\r\n");
out.write(" Title \r\n");
out.write("\r\n");
out.write("\r\n");
out.write("\r\n");
out.write("您是第");
out.print(counter++);
out.write("位访客!\r\n");
out.print(request.getRealPath(""));
out.write("\r\n");
out.write("\r\n");
out.write("\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默认采用的是单实例多线程的方式对外提供服务,一个用户请求启动一个线程
如果需要使用多实例单线程的方式
<%@ 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 {
jsp和Servlet都是SUN公司针对动态网页开发提出的技术,基本上两者之间可以相互替代,jsp 究其本质就是servlet,因为jsp的二次编译的第一次就是将jsp转换为servlet。
模板元素:
其中的合法的jsp语法要素继续执行,但是不显示执行效果。例如
如果注释中有不合法的jsp语句,仍旧会出5xx的报错
// /* */ /** */
page 指令用于定义 JSP 页面的各种属性。page属性很多,常用的属性有 import、language、
pageEncoding 等
语法格式 <%@ page language=“java” contentType=“text/html; charset=UTF-8” %>
response.setContentType(“text/html;charset=utf-8”); 响应内容类型用于告知浏览器如何
处理服务器生成的响应流。遵循MIME【多用途互联网邮件扩展协议】协议标准
text/html、image/jpeg,其它可以在服务器的web.xml中进行查询
rip 文件扩展名
audio/vnd.rip 对应的MIME格式串的写法
<%@ page import="java.util.*,java.io.*" %>
<%@ page import="java.text.DateFormat" %>
默认情况下,在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
专门只针对错误状态码进行定义显示页面,例如404、403等
404
/err404.html
人为产生错误响应状态的方法 response.sendError(int,String)
应用全局异常处理
java.lang.Exception
/err.jsp
<%@ page language="java" session="false"%>
<%=session%> 在IDE工具中语法报错
静态包含指令用于引入其它JSP文件。使用include指令引入的其它JSP文件,JSP引擎将把这两个JSP文件翻译成一个servlet,所以include称为静态包含
静态包含<%@ include file=“” %>是把包含的页面内容原封装不动的输出到包含的位置。
web页面之间的相互关系:
- 包含,包含可以分为静态包含和动态包含
- 请求转发
- 重定向
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标记。
动态包含
servlet程序。并把计算的结果返回。动态包含是在执行的时候才会加载。所以叫动态包含
http://localhost:8080/20221122/index.jsp?id=100&name=zhangsan
注意在被包含页面中可以通过parameter接收参数
重点:静态包含和动态包含的区别
实际工作中几乎都是使用静态包含。因为 jsp 页面虽然可以写 java 代码做其他的功能操作。但是由于jsp在开发过程中被定位为专门用来展示页面的技术。也就是说jsp 页面中,基本上只有 html、css、js。还有一些简单EL表达式脚本等输出语句。所以都使用静态包含
请求转发 jsp:forward 转发功能相当于request.getRequestDispatcher(“”).forward(request,response); 的功能。
基础语法
重定向 response.sendRedirect
- 是否共享request
- 是否客户端参与
html转发
3秒后刷新页面:
3秒之后跳转页面:
JavaBean是一个遵循特定写法的Java类,它通常具有特点:
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对象。
因为jsp:useBean只有在不存在具有相同id和scope的对象时才会实例化新的对象;如果已有
id和scope都相同的对象则直接使用已有的对象,此时jsp:useBean开始标记和结束标记之间
的任何内容都将被忽略
典型应用1:
定义值bean【DTO、DAO、BO、VO】
public class Student{
private String usenrame;
private String password;
private Integer age;
//对应的get/set方法,注意命名规则
}
在bb.jsp页面中接收数据,注意 * 的用法
可以直接从request的
parameter中接收请求参数,按照名称对应的方法设置到student对象中,如果需要则自动进行数据类型
转换。
如果名称不一致可以使用setProperty进行设置
允许给值bean属性设置具体的数据
<% int ss=18; %>
"/>
<% request.setCharacterEncoding("UTF-8");
Student student=new Student();
session.setAttribute("student",student);
%>
语法报错,因为临时变量
student和useBean的id值相同
使用useBean创建的对象可以当作临时变量使用
<%=student%>
给插件添加参数
当applet或者bean不能正常执行时显示的内容
Unable to load applet
介绍: 可以在JSP页面直接使用这九大对象
1、request对象是javax.servlet.HttpServletRequest类型的对象。该对象代表了客户端的请求信息,主要用于接受通过HTTP协议传送到服务器的数据。(包括头信息、系统信息、请求方式以及请求参数等)。request对象的作用域为一次请求。
2、response对象是HttpServletResponse类型的对象,代表的是服务器对客户端的响应,主要是将JSP容器处理过的对象传回到客户端。response对象也具有作用域,它只在JSP页面内有效。
3、out 对象是一个输出流,用来向客户端输出数据,可以是各种数据类型的内容,同时,它还可以管理应用服务器上的输出缓冲区,缓冲区的默认值是 8KB,可以通过页面指令 page 来改变默认大小。out对象是一个继承自抽象类 javax.servlet.jsp.JspWriter 的实例,在实际应用中,out 对象会通过 JSP 容器变换为 java.io.PrintWriter 类的对象。(可以简单理解:JspWriter就是带缓存的PrintWrieter)
<%
out.println("xxxx"); 理论上来说应该是先输出xxxx,再输出111111。但是实际上执行的结果为
先输出111111,然后输出xxxx
response.getWriter().println("11111");
%>
out流和writer流的两个缓冲区
4、application对象是ServletContext类型对象,用于保存应用程序的公用数据,服务器启动并自动创建application对象后,只要没有关闭服务器,application对象就一直存在,所有用户共享application对象。
abc
1234
5、session对象是HttpSession类型的对象,作用域一次会话的所有页面之间,只要保持同一会话,把一个键值对设置到session中,无论跳转到哪个页面都可以取到session中的键值对。
相关配置web.xml
30
session的激活钝化机制
6、config 对象是 javax.servlet.Servlet类的实例,表示 Servlet 的配置信息。
jsp配置初始化参数 web.xml
bb
/bb.jsp
rows
1234
bb
/bb.do
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进行访问
7、page 对象是为了执行当前页面应答请求而设置的 Servlet类的实体,即显示 JSP页面自身,与类的this 指针类似,使用它来调用 Servlet 类中所定义的方法,只有在本页面内才是合法的。它是java.lang.Object 类的实例
<%! int counter=0;%> 定义属性
<%=this.counter%> this用于指代当前页面对象,可以直接访问属性
<%=page.counter %> 语法错误,因为page是Object类型,Object中没有counter属性
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获取异常信息,只要在开发阶段需要输出异常的详细信息
<%@ 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 异常处理的机制
代表当前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对象提供的方法
存储数据会涉及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”); 动态包含
网络答题
<%
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++;
%>
您得了<%=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对象的setContentType方法
将当前页面保存为word文档吗?
<%
String str=request.getParameter("submit");
if(str==null)str="";
if(str.equals("yes"))
response.setContentType("application/msword;charset=GB2312");
%>