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("<!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脚本
    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中
<error-page>
    <error-code>404</error-code>
    <location>/error.jsp</location>
</error-page>
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:include page="被包含的页面"/>
  • 请求转发:<jsp:forward page="要转发的资源" />
静态包含与动态包含的区别
  • 静态包含把连个jsp文件拼接在一起再翻译成servlet(最终生成1个文件)
  • 动态包含是分别将两个jsp翻译后再拼接在一起(最终生成多个文件)
显示商品列表
  • product.jsp
  • navicat
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,587评论 18 399
  • 1.学习内容 JSP技术入门和常用指令 JSP的内置对象&标签介绍 EL表达式&EL的内置对象 2.JSP技术入门...
    WendyVIV阅读 2,119评论 1 18
  • 1.什么是JSP (1)jsp全称是Java Server Pages,它和Servlet技术一样都是sun公司定...
    yjaal阅读 3,635评论 5 99
  • 前面讲了servlet入门实践现在开始介绍jsp入门实践,开发环境的搭建请参考我前面的tomcat的文章,jsp入...
    伊豚wall阅读 3,359评论 2 56
  • OCP开发原则:扩展是开放的,修改是关闭的。 1.JSP是什么? -javaSErver Pages -基于jav...
    yangliangliang阅读 413评论 0 3