javaweb

本文详细介绍了JSP的基础知识,包括它的概念、工作原理、基本语法如表达式、脚本片段和声明。同时,讲解了JSP的九大内置对象,以及如何使用JSTL和EL表达式增强动态页面功能。此外,还涵盖了JSP的错误页面定制和Filter过滤器的实现,最后探讨了MVC三层架构在Web开发中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、什么是jsp

  • Java Server Pages: Java服务器端页面,也和Servlet一样,用于动态Web技术!
  • 特点:写JSP就像在写HTML
  • 区别:html只给用户提供静态的数据,jsp页面中可以嵌入java代码,为用户提供动态数据

2、JSP原理

  • 浏览器向服务器发送请求,不管访问什么资源,其实都是在访问Servlet!
  • JSP最终也会被转换成为一个Java类!
  • JSP 本质上就是一个Servlet

内置一些对象:

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                      //响应

方法

//初始化
  public void _jspInit() {
      
  }
//销毁
  public void _jspDestroy() {
  }
//JSPService
  public void _jspService(.HttpServletRequest request,HttpServletResponse response)


在这里插入图片描述
在JSP页面中;

  • 只要是 JAVA代码就会原封不动的输出;
  • 如果是HTML代码,就会被转换为:
out.write("<html>\r\n");

这样的格式,输出到前端!

3、JSP基础语法

JSP表达式

  <%--JSP表达式
  作用:用来将程序的输出,输出到客户端
  <%= 变量或者表达式%>
  --%>
  <%= new java.util.Date()%>

jsp脚本片段


  <%--jsp脚本片段--%>
  <%
    int sum = 0;
    for (int i = 1; i <=100 ; i++) {
      sum+=i;
    }
    out.println("<h1>Sum="+sum+"</h1>");
  %>


脚本片段的再实现

  <%
    int x = 10;
    out.println(x);
  %>
  <p>这是一个JSP文档</p>
  <%
    int y = 2;
    out.println(y);
  %>

  <hr>


  <%--在代码嵌入HTML元素--%>
  <%
    for (int i = 0; i < 5; i++) {
  %>
    <h1>Hello,World  <%=i%> </h1>
  <%
    }
  %>


JSP声明

  <%!
    static {
      System.out.println("Loading Servlet!");
    }

    private int globalVar = 0;

    public void kuang(){
      System.out.println("进入了方法Kuang!");
    }
  %>


JSP声明:会被编译到JSP生成Java的类中!其他的,就会被生成到_jspService方法中!

在JSP,嵌入Java代码即可!

<%%>
<%=%>
<%!%>

<%--注释--%>

4、JSP指令

<%@page args.... %>
<%@include file=""%>

<%--@include会将两个页面合二为一--%>

<%@include file="common/header.jsp"%>
<h1>网页主体</h1>

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

<hr>


<%--jSP标签
    jsp:include:拼接页面,本质还是三个
    --%>
<jsp:include page="/common/header.jsp"/>
<h1>网页主体</h1>
<jsp:include page="/common/footer.jsp"/>


5、9大内置对象

  • PageContext 存东西
  • Request 存东西
  • Response
  • Session 存
  • Application 【ServletContext】存
  • config 【ServletConfig】
  • out
  • page ,不用了解
  • exception
pageContext.setAttribute("name1","他化1号"); //保存的数据只在一个页面中有效
request.setAttribute("name2","他化2号"); //保存的数据只在一次请求中有效,请求转发会携带这个数据
session.setAttribute("name3","他化3号"); //保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器
application.setAttribute("name4","他化4号");  //保存的数据只在服务器中有效,从打开服务器到关闭服务器

在这里插入图片描述
request:客户端向服务器发送请求,产生的数据,用户看完就没用了,比如:新闻,用户看完没用的!
session:客户端向服务器发送请求,产生的数据,用户用完一会还有用,比如:购物车;
application:客户端向服务器发送请求,产生的数据,一个用户用完了,其他用户还可能使用,比如:聊天数据;

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

JSTL

<!-- JSTL表达式的依赖 -->
<dependency>
    <groupId>javax.servlet.jsp.jstl</groupId>
    <artifactId>jstl-api</artifactId>
    <version>1.2</version>
</dependency>
<!-- standard标签库 -->
<dependency>
    <groupId>taglibs</groupId>
    <artifactId>standard</artifactId>
    <version>1.1.2</version>
</dependency>


EL表达式:$

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

JSP标签

<%--jsp:include--%>

<%--
http://localhost:8080/jsptag.jsp?name=kuangshen&age=12
--%>

<jsp:forward page="/jsptag2.jsp">
    <jsp:param name="name" value="kuangshen"></jsp:param>
    <jsp:param name="age" value="12"></jsp:param>
</jsp:forward>


JSTL表达式:

  • 作用:JSTL标签库的使用就是为了弥补HTML标签的不足;
  • 它自定义许多标签,可以供我们使用,标签的功能和Java代码一样!
    核心标签:
    在这里插入图片描述
<%--
  Created by IntelliJ IDEA.
  User: 11581
  Date: 2023/7/13
  Time: 16:33
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
<%--  jsp表达式--%>
  <%= new java.util.Date()%>
  $END$
  </body>
</html>

1、JSP表达式:

<%= 变量或者表达式%>
<%= new java.util.Date()%>
作用:用来将程序的输出,输出到客户端

2、JSP脚本片段:

格式:
<%

%>
实例:

<%--jsp 脚本片段--%>
  <%
    int sum = 0;
    for (int i = 0; i < 100; i++) {
      sum += 1;
    }
    out.println("<h1>Sum="+sum+"</h1>");
  %>

3、JSP声明

语法:
<%!

%>

  <%!
    static {
      System.out.println("Loading Servlet!");
    }

    private int globalVar = 0;

    public void kuang(){
      System.out.println("进入了方法Kuang!");
    }
  %>


JSP声明:会被编译到JSP生成Java的类中!其他的,就会被生成到_jspService方法中!

4、EL表达式

写法:${}

在这里插入代码片

4、JSP写法

<%%>
<%=%>
<%!%>

<%–注释–%>

在这里插入图片描述

8、定制错误页面

目录:
在这里插入图片描述

jsp2.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--定制错误页面--%>
    <%--<%@ page errorPage="error/500.jsp" %>--%>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
  int x = 1/0;
%>
</body>
</html>

index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
<%--  jsp表达式--%>
  <%= new java.util.Date()%>
<%--jsp 脚本片段--%>
  <%
    int sum = 0;
    for (int i = 0; i < 100; i++) {
      sum += 1;
    }
    out.println("<h1>Sum="+sum+"</h1>");
  %>
  $END$
  </body>
</html>

404.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<img src="../img/404.jpg" alt="404">
</body>
</html>

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">

    <error-page>
        <error-code>404</error-code>
        <location>/error/404.jsp</location>
    </error-page>
    <error-page>
        <error-code>500</error-code>
        <location>/error/500.jsp</location>
    </error-page>
</web-app>

jsp3.jsp

<%@ 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>

9、JavaBean

什么是javabean:实体类
javabean有特定的写法:

  • 必须要有一个无参构造
  • 属性必须私有化
  • 必须有对应的get、set方法
  • 般用来和数据库字段做映射ORM
  • ORM:对象关系映射
  • 表–类
  • 字段–属性
  • 记录行–对象

1、第一个javaBean

javabean–
pojo–people.java

public class People {
    private int id;
    private String name;
    private int age;
    private String address;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public People(int id, String name, int age, String address) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.address = address;
    }

    public People() {
    }

    @Override
    public String toString() {
        return "People{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", address='" + address + '\'' +
                '}';
    }
}

javabean.jsp

<%@ page import="com.kuang.pojo.People" %><%--
  Created by IntelliJ IDEA.
  User: 11581
  Date: 2023/7/16
  Time: 16:22
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

<%
    //People people = new People();
%>
<jsp:useBean id="people" class="com.kuang.pojo.People" scope="page"/>

<jsp:setProperty name="people" property="address" value="北京"/>
<jsp:setProperty name="people" property="id" value="1"/>
<jsp:setProperty name="people" property="name" value="小明"/>
<jsp:setProperty name="people" property="age" value="18"/>

姓名:<jsp:getProperty name="people" property="age"/>
id:<jsp:getProperty name="people" property="id"/>
age:<jsp:getProperty name="people" property="age"/>
address:<jsp:getProperty name="people" property="address"/>


</body>
</html>

10、MVC三层架构

  • 什么是MVC:Model,View,Controller 模型,视图,控制器

10.1以前的架构

在这里插入图片描述
用户直接访问控制层,控制层就可以直接操作数据库;

servlet--CRUD-->数据库
弊端:程序十分臃肿,不利于维护  
servlet的代码中:处理请求、响应、视图跳转、处理JDBC、处理业务代码、处理逻辑代码

架构:没有什么是加一层解决不了的!
程序猿调用
↑
JDBC (实现该接口)
↑
Mysql Oracle SqlServer ....(不同厂商)


10.2 MVC三层架构

在这里插入图片描述

在这里插入图片描述

11、Filter过滤器

Filter:过滤器,用来过滤网站的数据

  • 处理中文乱码
  • 登陆验证

在这里插入图片描述
filter开发过程:

  • 1、导包
        <!-- 连接数据库 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>

        <!-- servlet依赖 -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
         
        </dependency>
        <!-- JSP依赖 -->
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.3.3</version>
     
        </dependency>
        <!-- standard标签库 -->
        <dependency>
            <groupId>taglibs</groupId>
            <artifactId>standard</artifactId>
            <version>1.1.2</version>
        </dependency>
        <!-- JSTL表达式的依赖 -->
        <dependency>
            <groupId>javax.servlet.jsp.jstl</groupId>
            <artifactId>jstl-api</artifactId>
            <version>1.2</version>
        </dependency>

  • 2、编写过滤器,实现Filter接口,重写对应的方法即可
//导入servlet的filter
public class CharacterEncodingFilter implements Filter {
    //初始化:web服务器启动,就已经初始化了,随时等待过滤对象出现
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("CharacterEncodingFilter初始化");

    }

    /**
     * Chain:;链
     * 1、过滤中的所有的代码在过滤特定请求的时候都会执行,
     * 2、必须让过滤器继续执行
     *         filterChain.doFilter(servletRequest,servletResponse);
    * */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        servletRequest.setCharacterEncoding("gbk");
        servletResponse.setCharacterEncoding("gbk");
        servletResponse.setContentType("text/html;charset=gbk");
        System.out.println("CharacterEncodingFilter执行前...");
        //让我们的请求继续走,如果不写,程序到这就会被拦截
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("CharacterEncodingFilter执行后...");


    }
    //销毁:web服务器关闭的时候,过滤会销毁
    @Override
    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>
       <!--<url-pattern>/*</url-pattern>-->
       <!-- 别偷懒写个 /* -->
   </filter-mapping>

    <servlet>
        <servlet-name>ShowServlet</servlet-name>
        <servlet-class>com.thb.servlet.ShowServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>ShowServlet</servlet-name>
        <url-pattern>/servlet/s</url-pattern>
    </servlet-mapping>
    <servlet>
        <servlet-name>Servlet</servlet-name>
        <servlet-class>com.thb.servlet.ShowServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Servlet</servlet-name>
        <url-pattern>/s</url-pattern>
    </servlet-mapping>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值