JavaWeb之jsp速通

Posted 生命是有光的

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaWeb之jsp速通相关的知识,希望对你有一定的参考价值。

1.JSP

概念:Java Server Pages, java服务器端页面

  • 可以理解为:一个特殊的页面,其中既可以指定定义html标签,又可以定义java代码
  • 用于简化书写!!!

原理:

  • JSP本质上就是一个Servlet

1.1JSP的脚本

JSP的脚本:JSP定义Java代码的方式

第一种: <%   %> java脚本段,可以定义局部变量、编写语句

第二种: <%!  %> 声明,可以定义全局(成员)变量、方法、类

第三种: <%=  %> 表达式,数据一个变量或具体内容

1.2JSP的指令

作用:用于配置JSP页面,导入资源文件

格式

<%@ 指令名称 属性名1 = 属性值1 属性名2 = 属性值2 ...%>

分类

  1. page : 配置JSP页面的
  2. include: 页面包含的。导入页面的资源文件
  3. taglib : 导入资源

1.2.1 page指令

  • contentType:等同于response.setContentType() 设置响应体的mime类型以及字符集
<%@ page contentType="text/html;charset=UTF-8" %>
  • import 导包
<%@ page import="java.util.ArrayList" %>
  • errorPage : 当前页面发生异常后,会自动跳转到指定的错误页面
<%@ page contentType="text/html;charset=UTF-8" errorPage="500.jsp" %>
  • isErrorPage : 标识当前页面是否是错误页面
    • true:是,可以使用内置对象exception
    • false:否。默认值。不可以使用内置对象exception
<%@ page contentType="text/html;charset=UTF-8" isErrorPage="true" %>

1.2.2 include指令

  • include : 页面包含的。导入页面的资源文件
<%@include file="top.jsp"%>

1.2.3taglib指令

  • taglib : 导入资源

1.3注释

在JSP中支持两种注释的语法操作

  • 一种是显示注释,这种注释是允许客户端看见的;
    • 显示注释语法:从HTML风格继承而来
  • 另一种是隐式注释,此种注释是客户端无法看见的
    • 隐式注释语法:从JAVA风格继承,JSP自己的注释

JSP注释方法

1. html注释:
		<!-- -->:只能注释html代码片段
2. jsp注释:推荐使用
		<%-- --%>:可以注释所有

1.4内置对象

内置对象:在jsp页面中不需要创建,直接使用的对象

变量名真实类型作用
pageContextPageContext当前页面共享数据,还可以获取其他八个内置对象
requestHttpServletRequest一次请求访问的多个资源(转发)
sessionHttpSession一次会话的多个请求间
applicationServletContext所有用户间共享数据
responseHttpServletResponse响应对象
pageObject当前页面(Servlet)的对象 this
outJspWriter输出对象,数据输出到页面上
configServletConfigServlet的配置对象
exceptionThrowable异常对象

2.MVC开发模式

jsp演变历史

  • 早期只有servlet,只能使用response输出标签数据,非常麻烦
  • 后来有jsp,简化了Servlet的开发,如果过度使用jsp,在jsp中即写大量的java代码,又写html表,造成难于维护,难于分工协作
  • 再后来,java的web开发,借鉴mvc开发模式,使得程序的设计更加合理性

MVC:

  1. M:Model,模型。JavaBeans
    • 完成具体的业务操作,如:查询数据库,封装对象
  2. V:View,视图。JSP
    • 展示数据
  3. C:Controller,控制器。Servlet
    • 获取用户的输入
    • 调用模型
    • 将数据交给视图进行展示

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W7H3XxZX-1620637026304)(JSP&itcast.assets/image-20210503195933692.png)]

优缺点:

​ 优点:耦合性低,方便维护,可以利于分工协作,重用性高

​ 缺点:使得项目架构变得复杂,对开发人员要求高

3.EL表达式

  • 概念:Expression Language 表达式语言

  • 作用:替换和简化jsp页面中java代码的编写

  • 语法:${表达式}

  • 注意:

    • jsp默认支持el表达式的。如果要忽略el表达式

      • 设置jsp中page指令中:isELIgnored="true"忽略当前jsp页面中所有的el表达式

      • <%@ page contentType="text/html;charset=UTF-8" isELIgnored="true" %>
        
      • \\${表达式} :忽略当前这个el表达式

      • \\${3 > 4 }
        

3.1EL表达式的使用

运算符

  • 算数运算符: + - * /(div) %(mod)
  • 比较运算符: > < >= <= == !=
  • 逻辑运算符: &&(and) ||(or) !(not)
  • 空运算符: empty
    • 功能:用于判断字符串、集合、数组对象是否为null或者长度是否为0
    • ${empty list}:判断字符串、集合、数组对象是否为null或者长度为0
    • ${not empty str}:表示判断字符串、集合、数组对象是否不为null 并且 长度>0

<%--
   比较两个值是否相等,返回 true 或者 false
   == 或者 eq
--%>

${a == b}
${c == d}
${c eq d}

3.1.1获取值

  • el表达式只能从域对象中获取值
  • 语法
  1. ${域名称.键名}:从指定域中获取指定键的值
  • 域名称
    • pageScope --> pageContext
    • requestScope --> request
    • sessionScope --> session
    • applicationScope --> application(ServletContext)
  • 举例:在request域中存储了name=张三
  • 获取:${requestScope.name}
  1. ${键名}:表示依次从最小的域中查找是否有该键对应的值,直到找到为止。

3.1.2获取对象

  • 获取对象、List集合、Map集合的值
  1. 对象:${域名称.键名.属性名}

    • 本质上会去调用对象的getter方法

    • ${requestScope.user.name}
      
  2. List集合:${域名称.键名[索引]}

    • ${list[2].name}
      
  3. Map集合:

    • ${域名称.键名.key名称}
    • ${域名称.键名["key名称"]}
${map.user.name}
${map.user.["name"]}

3.1.3隐式对象

  • el表达式中有11个隐式对象
  • pageContext
    • 获取jsp其他八个内置对象
    • ${pageContext.request.contextPath}:动态获取虚拟目录

4.JSTL

  • 概念:JavaServer Pages Tag Library JSP标准标签库

    • 是由Apache组织提供的开源的免费的jsp标签 <标签>
  • 作用:用于简化和替换jsp页面上的java代码

  • 使用步骤:

    • 导入jstl相关jar包

      • 此时需要导入两个 jar 包

      • jstl.jar

      • standard.jar

      • 下载地址:http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/

      • 下载 jakarta-taglibs-standard-1.1.2.zip

      • 解压,将 jakarta-taglibs-standard-1.1.2/lib/ 下的两个 jar 文件standard.jarjstl.jar 文件拷贝到项目的指定目录下

    • 引入标签库:taglib指令: <%@ taglib %>

    • 使用标签


我们现在只讨论JSTL中最重要的标签,迭代集合以及格式化数字和日期几个标签

核心标签库:

  • http://java.sun.com/jsp/jstl/core

  • 包含Web应用的常见工作,比如:循环、表达式赋值、基本输入输出等。

格式化标签库:

  • http://java.sun.com/jsp/jstl/fmt

  • 用来格式化显示数据的工作,比如:对不同区域的日期格式化等。

  • 为了在JSP页面使用JSTL类库,必须以下列格式使用 taglib 指令

<%@taglib  prefix = "" uri = "" %>
  • 例如
<%@taglic prefix="c" uri = "http://java.sun.com/jsp/jstl/core" %>

4.1常用的JSTL标签

if : 相当于java代码的if语句

  • 属性:
    • test 必须属性,接受boolean表达式
    • 如果表达式为true,则显示if标签体内容,如果为false,则不显示标签体内容
    • 一般情况下,test属性值会结合el表达式一起使用
  • 注意:
    • c:if标签没有else情况,想要else情况,则可以在定义一个c:if标签
<body>
    <c:if test="">我是真的皮</c:if>
    
    <h1>test属性结合el表达式一起使用</h1>
    <c:if test="${not empty list}">
        遍历集合....
    </c:if>
</body>

choose:相当于java代码的switch语句

  • 使用choose标签声明 相当于switch声明
  • 使用when标签做判断 相当于case
  • 使用otherwise标签做其他情况的声明 相当于default
<c:choose>
        <c:when test="${number == 1}">星期一</c:when>
        <c:when test="${number == 2}">星期二</c:when>
        <c:when test="${number == 3}">星期三</c:when>
        <c:when test="${number == 4}">星期四</c:when>
        <c:when test="${number == 5}">星期五</c:when>
        <c:when test="${number == 6}">星期六</c:when>
        <c:when test="${number == 7}">星期天</c:when>

        <c:otherwise>数字输入有误</c:otherwise>
</c:choose>

foreach:相当于java代码的for语句

5.三层架构:软件设计架构

  1. 界面层(表示层):用户看的得界面。用户可以通过界面上的组件和服务器进行交互
  2. 业务逻辑层:处理业务逻辑的。
  3. 数据访问层:操作数据存储文件。

在这里插入图片描述

6.过滤器Filter

概念

  • 生活中的过滤器:净水器,空气净化器
  • web中的过滤器:当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能

过滤器的作用

  • 一般用于完成通用的操作。如:登录验证、统一编码处理、敏感字符过滤

6.1快速入门

步骤

  1. 定义一个类,实现接口Filter
  2. 复写方法
  3. 配置拦截路径
    • web.xml
    • 注解

/**
 * 过滤器快速入门程序
 */
//@WebFilter("/*")//访问所有资源之前,都会执行该过滤器
public class FilterDemo1 implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("filterDemo1被执行了....");


        //放行
        filterChain.doFilter(servletRequest,servletResponse);

    }

    @Override
    public void destroy() {

    }
}

6.2过滤器细节

可以用注解配置拦截路径,也可以在web.xml设置拦截路径

web.xml

<filter>
	 <filter-name>demo1</filter-name>
	 <filter-class>cn.itcast.web.filter.FilterDemo1</filter-class>
</filter>
<filter-mapping>
	  <filter-name>demo1</filter-name>
		<!-- 拦截路径 -->
	  <url-pattern>/*</url-pattern>
</filter-mapping>

过滤器执行流称

  1. 执行过滤器
  2. 执行放行后的资源
  3. 回来执行过滤器放行代码下边的代码

过滤器生命周期方法

  • init:在服务器启动后,会创建Filter对象,然后调用init方法。只执行一次。用于加载资源
  • doFilter:每一次请求被拦截资源时,会执行。执行多次
  • destroy:在服务器关闭后,Filter对象被销毁。如果服务器是正常关闭,则会执行destroy方法。只执行一次。用于释放资源

过滤器配置详解

  • 拦截路径配置
    • 具体资源路径: /index.jsp 只有访问index.jsp资源时,过滤器才会被执行
    • 拦截目录: /user/* 访问/user下的所有资源时,过滤器都会被执行
    • 后缀名拦截: *.jsp 访问所有后缀名为jsp资源时,过滤器都会被执行
    • 拦截所有资源:/* 访问所有资源时,过滤器都会被执行
  • 拦截方式配置:资源被访问的方式
    1. 注解配置:设置dispatcherTypes属性
      1. REQUEST:默认值。浏览器直接请求资源
      2. FORWARD:转发访问资源
      3. INCLUDE:包含访问资源
      4. ERROR:错误跳转资源
      5. ASYNC:异步访问资源
// 浏览器直接请求index.jsp资源时,该过滤器会被执行
@WebFilter(value="/index.jsp",dispatcherTypes = DispatcherType.REQUEST)

// 只有转发访问index.jsp时,该过滤器才会被执行
@WebFilter(value="/index.jsp",dispatcherTypes = DispatcherType.FORWARD)

//浏览器直接请求index.jsp或者转发访问index.jsp。该过滤器才会被执行
@WebFilter(value="/*",dispatcherTypes ={ DispatcherType.FORWARD,DispatcherType.REQUEST})

​ 2. web.xml配置:设置<dispatcher></dispatcher>标签即可

<filter>
	 <filter-name>demo1</filter-name>
	 <filter-class>cn.itcast.web.filter.FilterDemo1</filter-class>
</filter>
<filter-mapping>
	  <filter-name>demo1</filter-name>
		<!-- 拦截路径 -->
	  <url-pattern>/*</url-pattern>
      <dispatcher>REQUESR</dispatcher>
</filter-mapping>

过滤器链(配置多个过滤器)

  • 执行顺序:如果有两个过滤器:过滤器1和过滤器2

    1. 过滤器1
    2. 过滤器2
    3. 资源执行
    4. 过滤器2
    5. 过滤器1
  • 过滤器先后顺序问题:

    1. 注解配置:按照类名的字符串比较规则比较,值小的先执行

      如: AFilter 和 BFilter,AFilter就先执行了。

    2. web.xml配置:<filter-mapping>谁定义在上边,谁先执行

7.监听器Listener

概念:web的三大组件之一 (Servlet,Listener,Filter)

事件监听机制

  • 事件 :一件事情
  • 事件源 :事件发生的地方
  • 监听器 :一个对象
  • 注册监听:将事件、事件源、监听器绑定在一起。 当事件源上发生某个事件后,执行监听器代码

7.1快速入门

ServletContextListener:监听ServletContext对象的创建和销毁

方法:

  • void contextDestroyed(ServletContextEvent sce):ServletContext对象被销毁之前会调用该方法
  • void contextInitialized(ServletContextEvent sce) :ServletContext对象创建后会调用该方法

步骤

  1. 定义一个类,实现ServletContextListener接口

  2. 复写方法

  3. 配置

    • web.xml
    <listener>
    <listener-class>cn.itcast.web.listener.ContextLoaderListener</listener-class>
    </listener>
    <!--指定初始化参数<context-param>-->
    <context-param>
        <param-name>***</param-name>
        <param-value>/WEB-INF/classes/applicationContext.xml</param-value>
    </context-param>
    
    • 注解:@WebListener

void contextDestroyed(ServletContextEvent sce):ServletContext对象被销毁之前会调用该方法

  • void contextInitialized(ServletContextEvent sce) :ServletContext对象创建后会调用该方法

步骤

  1. 定义一个类,实现ServletContextListener接口

  2. 复写方法

  3. 配置

    • web.xml
    <listener>
    <listener-class>cn.itcast.web.listener.ContextLoaderListener</listener-class>
    </listener>
    <!--指定初始化参数<context-param>-->
    <context-param>
        <param-name>***</param-name>
        <param-value>/WEB-INF/classes/applicationContext.xml</param-value>
    </context-param>
    
    • 注解:@WebListener

以上是关于JavaWeb之jsp速通的主要内容,如果未能解决你的问题,请参考以下文章

20160331javaweb之JSP 标签技术

javaweb入门-----jsp概念

20160327javaweb 之JSP入门

javaweb之jsp标签

javaweb核心之页面技术

JavaWeb之JSP原理