jsp
- jsp可以认为是在html中嵌入java代码的html文件
- 没有jsp,我们写动态页面需要手动一行一行的response.getWriter().write()来逐行把html代码回写到浏览器,同时判断添加动态数据
- jsp则把写html的代码自动帮你转成servlet中response.getWriter().write()的代码,节省了很多时间,我们只需要 专注与写业务
- jsp出来后曾经一度替代了servlet,后来代码太乱,又有html,css,js,java.页面代码,操作数据库代码,业务代码
- 后来为了优化代码,把业务逻辑写在servlet,页面显示写在jsp
//通过Servlet实现动态页面
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter writer = response.getWriter();
//动态的响应html页面
writer.write("<!DOCTYPE html>");
writer.write("<html>");
writer.write("<head>");
writer.write("<meta charset='UTF-8'>");
writer.write("<title>Insert title here</title>");
writer.write("</head>");
writer.write("<body>");
writer.write("<h1>这里写入动态代码</h1>");
writer.write("</body>");
writer.write("</html>");
}
//通过jsp实现动态页面
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!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=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<%
String info = request.getParameter("info");
info = new StringBuilder("Hello,").append(info).toString();
%>
<%=info %>
</body>
</html>
- 通过jsp,我们只需要关注动态的逻辑代码就可以,其他的静态页面,tomcat在把jsp转成servlet中会帮我们逐行加上response.getwriter().write()
简介
- 如果要在Servlet中动态响应html页面,则需要在response中输出整个页面,不能局部修改某个特定位置
- 很久很久之前的程序员开发动态页面就是这么做的,整个页面逐行修改输出.来达到修改局部信息动态改变的效果( Servlet相当于在java代码中嵌入html)
- 这种开发方式并不好,效率很低,后来模仿php等语言,在html中嵌入java代码,于是有了jsp(jsp是简化后的servlet)
- 后来很多人都用jsp开发而不用servlet,但是遇到的业务越来越复杂,jsp解决起来很麻烦,于是把jsp和servlet合并起来开发
- Servlet擅长java代码,jsp擅长页面显示
jsp脚本和注释
- jsp脚本
- <%java 代码%>(内部的java代码翻译到service方法的内部)(原封不动的搬过去service方法内)
- <%=java变量或表达式>(会被翻译成service方法内部out.print())(作为service方法中out.print()的参数)
- <%!java 代码%>(会被翻译成servlet的成员的内容)
- jsp注释(不同的注释,可见范围是不同的)
- html注释:(jsp源码,翻译后的servlet,显示的html都有)
- java注释://单行注释,/**/多行注释(jsp源码和翻译后的servlet有)
- jsp注释:<%--注释内容--%>(只有jsp源码有)
jsp运行原理(本质就是servlet)面试
- jsp第一次被访问时会被web容器翻译成servlet
- 访问服务器任何资源都是servlet帮你指向的
- 访问jsp文件,通过tomcat的web.xml中扩展名匹配找到jspServlet,通过该servlet来翻译jsp文件
- 在tomcat的work目录中
- ctrl + shift + t :快速打开某个类的源码
- 第一次访问-->index.jsp-->index_jsp.java(是一个servlet)-->编译运行(index_jsp.class)
- html的内容,会通过response.getWriter().write()写在页面上
- <% %>中的内容,会以java的形式执行,翻译在service方法内部
- <%= %>的内容会执行后写在页面上
- <%! %>中的内容翻译到service成员的位置
- <% %>:翻译到service内作为局部代码块.<%! %>:翻译到成员位置,用于定义方法和变量
- PS:被翻译后的servlet在Tomcat的work目录中可以找到
jsp指令(3个)
- jsp指令是指导jsp翻译和运行的指令,jsp包含三大指令
-
page指令: (属性最多的指令,但是在实际开发中,page指令默认)
格式:<%@ page 属性名1= "属性值1" 属性名2= "属性值2" ...%> language:jsp脚本中可以嵌入的语言种类 (只能写java,一开始设计时为了兼容其他语言,但是其他语言不用jsp,到目前为止也只支持java) pageEncoding:当前jsp文件的本身编码---内部可以包含contentType contentType:response.setContentType(text/html;charset=UTF-8) session:是否jsp在翻译时自动创建session import:导入java的包 errorPage:当当前页面出错后跳转到哪个页面 isErrorPage:当前页面是一个处理错误的页面
-
include指令:
- 页面包含(静态包含)指令,可以将一个jsp页面包含到另一个jsp页面中
- 格式:<%@ include file="被包含的文件地址"%>
-
taglib指令:
- 在jsp页面中引入标签库(jstl标签库、struts2标签库)
- 格式:<%@ taglib uri="标签库地址" prefix="前缀"%>
配置错误页面
- web.xml中
<error-page>
<error-code>404</error-code>
<location>/error.jsp</location>
</error-page>
jsp的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类的实例
- pageContext-->javax.servlet.jsp.PageContext-->JSP的页面容器
- exception-->java.lang.Throwable-->表示JSP页面所发生的异常,在错误页中才起作用
- 上下文对象维护者资源的索引
out的类型:JspWriter
out作用就是想客户端输出内容----out.write()
out缓冲区默认8kb 可以设置成0 代表关闭out缓冲区内容直接写到respons缓冲器
pageContext
jsp页面的上下文对象,作用如下:
page对象与pageContext对象不是一回事
pageContext是一个域对象,作用范围为当前页面,作用也不是特别大,定义一个局部变量
setAttribute(String name,Object obj)
getAttribute(String name)
removeAttrbute(String name)
pageContext可以向指定的其他域中存取数据
setAttribute(String name,Object obj,int scope)
getAttribute(String name,int scope)
removeAttrbute(String name,int scope)
//使用pageContext向request域存数据
request.setAttribute("name", "zhangsan");
pageContext.setAttribute("name", "sunba");
pageContext.setAttribute("name", "lisi", PageContext.REQUEST_SCOPE);
pageContext.setAttribute("name", "wangwu", PageContext.SESSION_SCOPE);
pageContext.setAttribute("name", "tianqi", PageContext.APPLICATION_SCOPE);
findAttribute(String name)
---依次从pageContext域,request域,session域,,pplication域中获取属性,在某个域中获取后将不在向后寻找
pageContext可以获得其他8大隐式对象
内部维护者其他8大对象的索引,写框架才用到
例如: pageContext.getRequest()
pageContext.getSession()
out有默认缓冲区8k,在page指令中可以设置,out缓冲区的数据只有刷到response缓冲区才能封装到http请求中
在后期开发中很少在页面中嵌套java代码
四个域对象
- page域:当前jsp页面范围
- request域:一次请求
- session域:一次会话
- application域:整个web应用
jsp标签
- 页面包含(动态包含):<jsp:include page="被包含的页面"/>
- 请求转发:<jsp:forward page="要转发的资源" />
静态包含与动态包含的区别
- 静态包含把连个jsp文件拼接在一起再翻译成servlet(最终生成1个文件)
- 动态包含是分别将两个jsp翻译后再拼接在一起(最终生成多个文件)
显示商品列表
- product.jsp
- navicat