WEB_17【jsp】

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ccnuacmhdu/article/details/82110883

特此说明:本文参考传智播客、黑马程序员视频讲座 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

一、jsp技术

servlet技术是在java代码中嵌入HTML代码:
仅用servlet开发,向客户端输出页面可以用response.getWriter().write()把对应的HTML的代码一行一行输出,这样很麻烦!!!
jsp技术是在HTML代码中嵌入java代码,jsp本身是servlet
写好的jsp会被翻译成servlet,存入Tomcat的work文件夹中。比如在WebContent下建立一个index.jsp文件,发布工程到Tomcat,然后去work文件夹中,可以找到index_jsp.java,这就是一个servlet,看到其中的类index_jsp继承了HttpJspBase,而查看HttpJspBase源码,继承了HttpServlet。由此可见jsp本质是servlet。

单独使用servlet或jsp都可以完成开发,但是servlet更善于java代码,而jsp更善于HTML代码,结合两者,利于更好的开发

1.jsp脚本和注释

jsp脚本:

  • 1)<%java代码%> —– 内部的java代码翻译到service方法的内部
  • 2)<%=java变量或表达式> —– 会被翻译成service方法内部out.print(),输出到页面
  • 3)<%!java代码%> —- 会被翻译成servlet的成员的内容

jsp注释: 不同的注释可见范围是不同

  • 1)Html注释:<!--注释内容--> — jsp源码、翻译后的servlet、页面 显示html源码
  • 2)java注释://单行注释 /*多行注释*/ –jsp源码、翻译后的servlet
  • 3)jsp注释:<%--注释内容--%> —– jsp源码

2. jsp运行原理—–jsp本质就是servlet

访问hello.jsp,在Tomcat下的work文件夹下去找,如果有hello_jsp.java,就编译运行!如果没有,把这个jsp翻译成一个servlet的java文件,编译运行。

在web.xml配置文件中,可以发现,如下配置:

<servlet-mapping>
        <servlet-name>jsp</servlet-name>
        <url-pattern>*.jsp</url-pattern>
        <url-pattern>*.jspx</url-pattern>
    </servlet-mapping>
<servlet>
        <servlet-name>jsp</servlet-name>
        <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
        <init-param>
            <param-name>fork</param-name>
            <param-value>false</param-value>
        </init-param>
        <init-param>
            <param-name>xpoweredBy</param-name>
            <param-value>false</param-value>
        </init-param>
        <load-on-startup>3</load-on-startup>
    </servlet>

说明,访问.jsp的时候,会去找相应的JspServlet,把jsp翻译成_jsp.java也就是Servlet做的!

3、jsp指令

(1)page指令(实际开发中使用默认属性配置即可)

根据不同的属性,指导整个页面特性

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

这是默认的属性设置,还有其他很多属性设置,可以看联想提示(空格后,alt+/)出来的有哪些属性,在此略

(2)include指令

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

应用:当多个前端页面拥有共同的头和尾,我们可以把头和尾分别写一个jsp文件,然后在写jsp的时候直接把这个头和尾直接引用过来即可!

(3)taglib指令

在jsp页面中引入标签库(jstl标签库、struts2标签库)
格式:<%@ taglib uri=”标签库地址” prefix=”前缀”%>

扫描二维码关注公众号,回复: 3303379 查看本文章

(4)jsp内置/隐式对象(9个)

jsp被翻译成servlet之后,service方法中有9个对象定义并初始化完毕,我们在jsp 脚本中可以直接使用这9个对象。
jsp翻译后的servlet里如下可看到8个对象如下:

这里写图片描述
还有一个exception对象,当页面page命令的属性isErrorPage=true当页面有错误抛出异常的时候,在jsp翻译后的Servlet里面就能看到exception对象了!

out对象

out的类型:JspWriter
out作用就是想客户端输出内容—-out.write()
out缓冲区默认8kb 可以设置成0 代表关闭out缓冲区。内容直接写到respons缓冲器。设置缓冲区大小的方法是在设置page命令的属性buffer的大小。

<%@ page language="java"  contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" %>

<!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=UTF-8">
<title>Insert title here</title>
</head>
<body>
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    <%
        response.getWriter().write("bbbbbbbbbbbbbbbbbbbbbb");
        out.write("ccccccccccccccccccccccccc");
    %>


    <%="ddddddddddddddddddddddddddd" %>

</body>
</html>

翻译到servlet中的代码会有如下:

        out.write("\taaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\r\n");
        response.getWriter().write("bbbbbbbbbbbbbbbbbbbbbb");
        out.write("ccccccccccccccccccccccccc");
        out.print("ddddddddddddddddddddddddddd" );

out对象先写入到自己的缓冲区中,然后才会写入到response的缓冲区中,所以先输出bbbbbbbbbbbbbbbbbbbbbb,再输出剩下的如下:
这里写图片描述

下面关闭掉out对象的缓冲区buffer=”0kb”,再次打印如下(没有out缓冲区后,直接输出到response的缓冲区中):

<%@ page language="java"  contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" buffer="0kb"%>

这里写图片描述

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)
findAttribute(String name)
—依次从pageContext域,request域,session域,application域中获 取属性,在某个域中获取后将不在向后寻找
例如:

pageContext.setAttribute("name", "Tom1",PageContext.PAGE_SCOPE);
pageContext.setAttribute("name", "Tom2",PageContext.REQUEST_SCOPE);
pageContext.setAttribute("name", "Tom3",PageContext.APPLICATION_SCOPE);
pageContext.findAttribute("name");  

四大作用域的总结:
page域:当前jsp页面范围
request域:一次请求
session域:一次会话
application域:整个web应用

可以获得其他8大隐式对象
例如: pageContext.getRequest()
pageContext.getSession()

4.jsp标签(动作)

1)页面包含(动态包含):<jsp:include page="被包含的页面"/>
静态包含与动态包含的区别?(查看被翻译成的Servlet可以明白)
静态包含—访问index.jsp,只会生成一个servlet:index_jsp.java。把new.jsp的页面代码直接复制到了index.jsp中,生成一个index_jsp.java,编译运行!

<%@ include file="/new.jsp" %>

动态包含—生成两个servlet:index_jsp.java和new_jsp.java,分别编译,在运行的时候把后者合并到前者。
2)请求转发:<jsp:forward page="要转发的资源" />

案例:完成商品列表展现(从数据库读取)

思路:从数据库读取每个商品的信息,存到request域中,转发给.jsp,在.jsp中嵌入java代码,读取request域中的内容,显示出来即可

猜你喜欢

转载自blog.csdn.net/ccnuacmhdu/article/details/82110883