Day22-JSP与Filter

Posted 2月2日

tags:

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

JSP

Java Server Pages : Java服务器端页面,动态Web技术!

特点

  1. 开发过程类似html
  2. 可以嵌入Java代码,提供动态数据

原理

JSP本质上是Servlet,在程序运行中,创建一个work文件夹存放JSP页面最终转换成的java文件,打开可以发现,jsp页面实现了HttpjspBase,继承自HttpServlet,JSP本质上是一个Servlet

image-20210620201559711

源码

  1. 判断请求(post,get等)
  2. 内置对象
final javax.servlet.jsp.PageContext pageContext;  //页面上下文
javax.servlet.http.HttpSession session = null;    //session
final javax.servlet.ServletContext application;   //applicationContext
final javax.servlet.ServletConfig config;         //config
javax.servlet.jsp.JspWriter out = null;           //out
final java.lang.Object page = this;               //page:当前
HttpServletRequest request                        //请求
HttpServletResponse response                      //响应
  1. 输出页面前增加响应代码
response.setContentType("text/html");       //设置响应的页面类型
pageContext = _jspxFactory.getPageContext(this, request, response,
       null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;

JSP基础语法

<%= 变量或者表达式 %> JSP表达式

将变量或者表达式输出到客户端

<% 代码块 %>

JSP脚本片段

<%
	int sum=0;
	for(int i = 0; i<1000 ; i++){
        sum+=i;
    }
	out.println("<h1>"+sum+"</h1>")
%>
代码的再实现
<%
	for(int i=0;i<5;i++){        
%>
<h1>
    Hello,World<%=i>
</h1>
<% } %>

image-20210620204618207

<%! 代码块 %>

JSP声明,提高代码的作用域,代码将会被编译到jsp生成的类下,其他则是生成到_jspService方法中

JSP指令

<%@ page ....%>

通过这个指令可以实现导包,配置错误页面,刷新等等功能

<%@ include file="文件路径" %>

将某个文件放在本页中

如设置多个页面的共同的头部和尾部

<%@include file="common/header.jsp">
   <div></div>
<%@include file="common/footer.jsp">

将common文件夹下的头部尾部插入到页面中

缺点

将页面合而唯一,可以会出现变量重名的问题,不够灵活

解决方式

<jsp: include page="common/header.jsp"> 使用jsp标签来拼接页面,实际上还是三个页面

JSP内置对象

  • PageContext 存东西
  • Request 存东西
  • Response
  • Session 存东西
  • Application 【SerlvetContext】 存东西
  • config 【SerlvetConfig】
  • out
  • page
  • exception
pageContext.setAttribute("name1","xx1"); //保存的数据只在一个页面中有效
request.setAttribute("name2","xx2"); //保存的数据只在一次请求中有效,请求转发会携带这个数据
session.setAttribute("name3","xx3"); //保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器
application.setAttribute("name4","xx4");  //保存的数据只在服务器中有效,从打开服务器到关闭服务器

几种存放数据的区别

request:客户端向服务器发送请求,产生的数据,用户看完就没用了,比如:新闻,用户看完没用的!

session:客户端向服务器发送请求,产生的数据,用户用完一会还有用,比如:购物车;

application:客户端向服务器发送请求,产生的数据,一个用户用完了,其他用户还可能使用,比如:聊天数据;

JSP标签、JSTL标签、EL表达式

EL表达式: ${ }

  • 获取数据
  • 执行运算
  • 获取web开发的常用对象

JSP标签

<jsp:forward page="/路径地址.jsp">
    <jsp:param name="xx" value="123"></jsp:param>
</jsp:forward>

JSTL

弥补HTML标签的不足

核心标签
  1. 引入
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  1. 使用标签

https://www.runoob.com/jsp/jsp-jstl.html

JavaBean (实体类)

JavaBean 是一种JAVA语言写成的可重用组件。为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器。JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员属性,set和get方法获取

写法

  • 必须拥有无参构造器
  • 属性必须私有化
  • 使用set、get来操作属性

用法

一般用于和数据库字段做映射 ORM

ORM:对象关系映射

MVC三层架构

Model、View、Controller

[(img-BWDJGUCN-1588757845419)(JavaWeb.assets/1568424227281.png)]

Model

  • 业务处理 :业务逻辑(Service)

  • 数据持久层:CRUD (Dao - 数据持久化对象)

View

  • 展示数据
  • 提供链接发起Servlet请求 (a,form,img…)

Controller (Servlet)

  • 接收用户的请求 :(req:请求参数、Session信息….)

  • 交给业务层处理对应的代码

  • 控制视图的跳转

Filter

过滤器,用于过滤网站的数据

原理

在web服务器与web资源(sevlet)中加一层过滤器,|||,通过的请求还有响应都会被过滤

运行

  1. 导入响应的依赖包

  2. 实现Filter接口,重写对应接口

    public class CharacterEncodingFilter implements Filter {    //初始化:web服务器启动,就以及初始化了,随时等待过滤对象出现!    public void init(FilterConfig filterConfig) throws ServletException {        System.out.println("CharacterEncodingFilter初始化");    }    //Chain : 链    /*    1. 过滤中的所有代码,在过滤特定请求的时候都会执行    2. 必须要让过滤器继续同行        chain.doFilter(request,response);     */    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {        request.setCharacterEncoding("utf-8");        response.setCharacterEncoding("utf-8");        response.setContentType("text/html;charset=UTF-8");        System.out.println("CharacterEncodingFilter执行前....");        chain.doFilter(request,response); //让我们的请求继续走,如果不写,程序到这里就被拦截停止!        System.out.println("CharacterEncodingFilter执行后....");    }    //销毁:web服务器关闭的时候,过滤器会销毁    public void destroy() {        System.out.println("CharacterEncodingFilter销毁");    }}
    
  3. 在web.xml中配置Filter过滤器

<filter>    <filter-name>CharacterEncodingFilter</filter-name>    <filter-class>com.kuang.filter.CharacterEncodingFilter</filter-class></filter><filter-mapping>    <filter-name>CharacterEncodingFilter</filter-name>    <!--只要是 /servlet的任何请求,会经过这个过滤器-->    <url-pattern>/servlet/*</url-pattern></filter-mapping>

以上是关于Day22-JSP与Filter的主要内容,如果未能解决你的问题,请参考以下文章

filter与servlet

js简洁代码片段

代码审计——filter_var函数

java---servlet与filter的联系与区别

day06-jsp

day05 协程函数,递归函数,匿名函数lambda,内置函数map reduce filter max min zip sorted,匿名函数lambda和内置函数结合使用,面向过程编程与函数编程