17_jsp

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("");
    writer.write("");
    writer.write("");
    writer.write("");
    writer.write("Insert title here");
    writer.write("");
    writer.write("");
    writer.write("

这里写入动态代码

"); writer.write(""); writer.write(""); }
//通过jsp实现动态页面
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>




Insert title here


    <%
        String info = request.getParameter("info");
        info = new StringBuilder("Hello,").append(info).toString();
    %>
    <%=info %>


  • 通过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脚本
    1. <%java 代码%>(内部的java代码翻译到service方法的内部)(原封不动的搬过去service方法内)
    2. <%=java变量或表达式>(会被翻译成service方法内部out.print())(作为service方法中out.print()的参数)
    3. <%!java 代码%>(会被翻译成servlet的成员的内容)
  • jsp注释(不同的注释,可见范围是不同的)
    1. html注释:(jsp源码,翻译后的servlet,显示的html都有)
    2. java注释://单行注释,/**/多行注释(jsp源码和翻译后的servlet有)
    3. 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包含三大指令
  1. 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:当前页面是一个处理错误的页面
    
  2. include指令:

    • 页面包含(静态包含)指令,可以将一个jsp页面包含到另一个jsp页面中
    • 格式:<%@ include file="被包含的文件地址"%>
  3. taglib指令:

    • 在jsp页面中引入标签库(jstl标签库、struts2标签库)
    • 格式:<%@ taglib uri="标签库地址" prefix="前缀"%>
配置错误页面
  • web.xml中

    404
    /error.jsp

jsp的9大隐式对象(毕业前要记住,笔试会问)
  • jsp中拿到直接能用的对象
  1. out-->javax.servlet.jsp.JspWriter-->用于页面输出
  2. request-->javax.servlet.http.HttpServletRequest-->得到用户请求信息,
  3. response-->javax.servlet.http.HttpServletResponse-->服务器向客户端的回应信息
  4. config-->javax.servlet.ServletConfig-->服务器配置,可以取得初始化参数
  5. session-->javax.servlet.http.HttpSession-->用来保存用户的信息
  6. application-->javax.servlet.ServletContext-->所有用户的共享信息
  7. page java.lang.Object-->指当前页面转换后的Servlet类的实例
  8. pageContext-->javax.servlet.jsp.PageContext-->JSP的页面容器
  9. 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文件拼接在一起再翻译成servlet(最终生成1个文件)
  • 动态包含是分别将两个jsp翻译后再拼接在一起(最终生成多个文件)
显示商品列表
  • product.jsp
  • navicat

你可能感兴趣的:(17_jsp)