JSP

------------恢复内容开始------------

 

JSP

  • 什么是JSP
    • 浏览器向服务器发送请求,不管访问什么资源,其实都是在访问Servlet,servlet最终会转换成为一个java类,JSP本质上就是一个Servlet
    • 在JSP页面中,java代码就会原封不动的输出,如果是HTML代码则会被转义成out.write("<html>\r\n")这样的格式输出到前端  
  •  jSP基础语法和指令
    •   <%-- 注释命令 --%>
    • <%-- JSP 表达式 用来将程序输出到客户端
      <%= 变量或者表达式 %>
      --%>
      <%= new java.util.Date() %>
    • <hr>
      <%-- 分割线 --%>
    • <%-- JSP声明:使生成的元素在java的类中,提高了元素的作用域!,其他的会生成到_javaService方法中 --%>
      <%!
      static {
      System.out.println("Loading Servlet!");
      }

      private int globVar = 0;
      public void method(){
      System.out.println("进入了method方法");
      }
      %>
  • JSP指令
    • page指令
      • <%@ page import="java.util.Date" %>导包
        <%@ page contentType="text/html;charset=UTF-8" language="java" %>设置网页参数
      • <%-- 定制错误页面 --%>
        <%@page errorPage="error/500.jsp" %>
        <%@ page contentType="text/html;charset=UTF-8" language="java" %>
        <html>
        <head>
            <title>Title</title>
        </head>
        <body>
            <img src="../img/500.png" alt = 500>
        </body>
        </html>
      • 在web.xml中配置错误页面
        <?xml version="1.0" encoding="UTF-8"?>
        <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
        http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
                 version="4.0"
                 metadata-complete="true">
        
        <error-page>
            <error-code>404</error-code>
            <location>/error/404.jsp</location>
        </error-page>
        
        </web-app>
      • <%@page isErrorPage="true" %>
        <%@page pageEncoding="UTF-8" %> 都是一些页面设置

 

    • include指令
      • <%@ page contentType="text/html;charset=UTF-8" language="java" %>
        <html>
        <head>
            <title>Title</title>
        </head>
        <body>
            <%@include file="common/header.jsp"%>
            <h1>
                我是主体
            </h1>
            <%@include file="common/footer.jsp"%>
        
            <hr>
            <%-- jsp 标签 --%>
            <jsp:include page="/common/header.jsp"/>
            <h1>
                我是主体
            </h1>
            <jsp:include page="common/footer.jsp"/>
        
        </body>
        </html>

        <%-- 两种方式的不同点是,@include会将两个页面合二为一,jsp标签的include是拼接页面,本质还是三个页面 --%>
         

 

  • JSP内置对象和作用域
    • jsp9大内置对象
      • PageContext 存东西
      • Requset 存东西
      • Respones
      • Session 存东西
      • Application[ServletContext] 存东西
      • config[ServletConfig]
      • out
      • exception
    • <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      <html>
      <head>
      <title>Title</title>
      </head>
      <body>
      <%-- 内置对象 何其不同的作用域--%>
      <%
      pageContext.setAttribute("name1","duf1");//保存的数据只在一个页面中有效
      request.setAttribute("name2","duf2");//保存的数据只在一次数据请求中有效,如果有页面的转发,该数据继续生效,否则该数据死亡
      session.setAttribute("name3","duf3");//保存的数据只在一车会话中有效,,从打开浏览器到关闭浏览器
      application.setAttribute("name4","duf4");//保存的数据在服务器中有效,从打开服务器到关闭服务器
      %>

      <%
      String name1 = (String) pageContext.findAttribute("name1");
      String name2 = (String) pageContext.findAttribute("name2");
      String name3 = (String) pageContext.findAttribute("name3");
      String name4 = (String) pageContext.findAttribute("name4");
      String name5 = (String) pageContext.findAttribute("name5");
      %>

      <%-- 使用EL表达式输出值 name5没有值就不会输出--%>
      <h1>取出的值为</h1>
      <h3>${name1}</h3>
      <h3>${name2}</h3>
      <h3>${name3}</h3>
      <h3>${name4}</h3>
      <h3>${name5}</h3>
      <hr>

      <%-- 使用jsp语法取值 name5会输出null --%>
      <h3><%= name5%></h3>
      </body>
      </html>
      • 各个作用域使用的场景
        • request:客户端向服务器发送请求,产生数据,用户看完就没用了,比如:新闻等
        • session:客户端向服务器发送请求,产生数据,用户用完一段时间还有用,比如:购物车
        • application:客户端向服务器发送请求,产生数据,一个用户用完了,其他用户可能还有用,比如:聊天数据
  • JSP标签&JSTL标签&EL表达式
    <!-- JSTL 表达式的依赖 -->
            <dependency>
                <groupId>javax.servlet.jsp.jstl</groupId>
                <artifactId>jstl</artifactId>
                <version>1.2</version>
            </dependency>
            <!-- standard 标签库依赖 -->
            <dependency>
                <groupId>taglibs</groupId>
                <artifactId>standard</artifactId>
                <version>1.1.2</version>
            </dependency>
    • EL表达式:${}
      • 获取数据
      • 执行运算
      • 获取web开发常用的对象

 

    • JSTL标签
  • javabean
    • 必须要有一个无参构造
    • 属性必须私有化
    • 必须有对应的set、get方法
    • 一般用来和数据库的字段做映射ORM
      • 表-->类
      • 字段-->属性
      • 行记录-->对象
  • MVC三层构架
    • model  模型
      • 业务处理:业务逻辑(service)
      • 数据持久层:CRUD(Dao)
    • view  视图 (JSP):专注于显示数据
      • 展示数据
      • 提供连接发起Servlet请求(a、form、img...) 
    • controller  控制器(servlet):专注于处理请求,以及控制视图跳转
      • 接收用户的请求(req:请求参数,Session信息)
      • 相应用户的请求(交给业务层去做)
      • 重定向或转发 (视图的跳转)
    •   登录-->接收用户的登录请求-->处理用户的请求(获取用户登录的参数,username,password)---->提交给业务层处理登录业务(判断用户名密码是否正确:事务)---->Dao层查询用户名和密码是否正确---->数据库(数据持久化)
  • Filter 过滤器
    • 用来过滤网站的数据
      • 处理中文乱码
      • 登录验证
    • Filter开发步骤
      • 导包  javax.servlet
      • 编写过滤器
        • 实现Filter接口,重写对应的方法即可
          public class CharacterEncodingFilter implements Filter {
              @Override
              public void init(FilterConfig filterConfig) throws ServletException {
                  //初始化,服务器启动就会初始化,随时等待过滤对象出现
                  System.out.println("CharacterEncodingFilter初始化");
              }
          
              @Override
              public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
                  servletRequest.setCharacterEncoding("UTF-8");
                  servletResponse.setCharacterEncoding("UTF-8");
                  servletResponse.setContentType("text/html;character=UTF-8");
          
                  /**
                   * filterChain:链
                   * 1、过滤中的所有代码在过滤特定请求的时候都会执行
                   * 2、必须要让过滤器继续通行
                   * filterChain.doFilter(servletRequest,servletResponse)
                   */
                  System.out.println("CharacterEncodingFilter执行前....");
                  filterChain.doFilter(servletRequest,servletResponse);//让我们的请求继续走,如果不写,程序到这里就被拦截停止
                  System.out.println("CharacterEncodingFilter执行后.....");
              }
          
              @Override
              public void destroy() {
                  //销毁,关闭服务器时,过滤会销毁
                  System.out.println("CharacterEncodingFilter销毁");
              }
          }
        • filter文件亦需要在web.xml中进行注册和映射
          <filter>
                  <filter-name>CharacterEncodingFilter</filter-name>
                  <filter-class>com.twilight.filter.CharacterEncodingFilter</filter-class>
              </filter>
              <filter-mapping>
                  <filter-name>CharacterEncodingFilter</filter-name>
                  <url-pattern>/servlet/*</url-pattern>
              </filter-mapping>

           此处可以为/servlet下的所有包都可以进行过滤,所以,映射Servlet路径时最好加上该路径

          <servlet>
                  <servlet-name>showServlet</servlet-name>
                  <servlet-class>com.twilight.servlet.ShowServlet</servlet-class>
              </servlet>
              <servlet-mapping>
                  <servlet-name>showServlet</servlet-name>
                  <url-pattern>/show</url-pattern>
                  <url-pattern>/servlet/show</url-pattern>
              </servlet-mapping>

           

  • 监听器

 

posted @ 2020-09-06 17:58  TwilightDF  阅读(197)  评论(0)    收藏  举报