JavaWeb-Servlet总结及JSP

目录

一、文件下载

二、ServletConfig对象

三、Web.xml文件使用总结

四、server.xml文件

五、JSP动态网页技术

1.概念:

2.动态网页:

3.特点:

4.JSP的访问原理:

5.JSP的文档说明:

6.jsp实际运行文件:

7.JSP文件运行原理:

8.JSP的语法和指令:

9.JSP的三种注释:

10.JSP中写Java代码的区域:

11.JSP的静态引入和动态引入

12.JSP内置对象:

六、EL表达式

七、jstl标签库学习


一、文件下载

1.文件下载的方式

(1)弹窗是使用附件的方式下载。

2.从服务器下载文件

(1)Content-Disposition是MIME协议的扩展,MIME协议指示MIME用户代理如何显示附加的文件。当Internet Explorer接收到头时,它会激活文件下载对话框。

(2)设置响应头:"Content-Disposition","attachment;filename="+filename。

3.案例:

java 复制代码
package com.web.servlet;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

@WebServlet("/download")
public class DownLoadServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        ServletContext sc = this.getServletContext();
        //获取到当前服务器中要下载的文件的绝对路径
        String realPath = sc.getRealPath("datas/1.jpg");
        System.out.println("realPath:" + realPath);
        //通过FileInputStream从服务器中读取文件数据(用一根管道怼到服务器上)
        FileInputStream in = new FileInputStream(realPath);
        //把这个数据读取之后响应给浏览器
        //从服务器中文件的路径获取文件的文件名
        File file = new File(realPath);
        String fileName = file.getName();
        //设置响应头,以附件(弹窗)的方式下载
        resp.setHeader("Content-Disposition","attachment;filename=" + fileName);
        //相当于输出流怼到浏览器上
        ServletOutputStream out = resp.getOutputStream();
        //把in流读到的数据写入到out流中
        byte[] bytes = new byte[1024];
        int len;
        while ((len = in.read(bytes)) != -1){
            out.write(bytes,0,len);
        }
        out.close();//缓冲流中有flush动作,在缓冲流中close()会先flush再close
        in.close();
    }
}

二、ServletConfig对象

1.ServletConfig对象可以获取web.xml中的配置信息。

2.ServletConfig对象是Servlet的专属配置对象,每个Servlet都单独拥有一个ServletConfig对象,用来获取web.xml中的局部配置信息。

3.可以再web.xml文件中的servlet标签下面配置某一个Servlet的独有的配置信息,通过ServletConfig对象获取,再这里设置的值,一般是在SpringMVC框架中给servlet类中的属性赋值。

4.获取ServletConfig对象:

(1)this.getServletConfig()。

(2)返回的是一个ServletConfig类型。

5.获取配置信息中的值:

(1)ServletConfig对象.getInitParameter("key");

6.ServletConfig和ServletContext的区别:

(1)ServletConfig是局部的,ServletContext是全局的。

(2)每个Servlet都有一个ServletConfig对象,而ServletContext对象在整个项目中只有一个。

(3)ServletConfig只能获取局部的配置信息,而ServletContext可以获取全局的配置信息。

7.案例:

(1)web.xml中的配置信息

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

    <servlet>
        <servlet-name>MyServlet</servlet-name>
        <servlet-class>com.web.servlet.MyServlet</servlet-class>
        <!--这是对指定的servlet独有的配置信息
        在这里设置的值,以后学习SpringMVC时会通过这种方式给servlet类中的属性赋值
        -->
        <init-param>
            <param-name>city</param-name>
            <param-value>beijing</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>MyServlet</servlet-name>
        <url-pattern>/my</url-pattern>
    </servlet-mapping>
</web-app>

(2)MyServlet中的代码

java 复制代码
package com.web.servlet;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class MyServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletConfig servletConfig = this.getServletConfig();
        String city = servletConfig.getInitParameter("city");
        System.out.println("city:" + city);
    }
}

三、Web.xml文件使用总结

1.每个web项目下都具备web.xml文件,这个文件是我们程序员和tomcat服务器打交道的文件。

2.tomcat下还有一个web.xml文件,这个文件的作用是:存储项目的相关的全局配置信息,保护Servlet。解耦一些数据对程序的依赖。

3.使用位置:

(1)每个web项目下的web.xml文件:每个web项目中。

(2)tomcat下的web.xml文件:Tomcat服务器中(在服务器目录conf目录中)。

4.区别:

(1)Web项目下的web.xml文件为局部配置,针对本项目的位置;tomcat下的web.xml文件为全局配置,配置公共信息,针对部署到tomcat中的所有项目有效。

(2)Web项目和Tomcat下都配置相同的信息,就近原则,取web项目下web.xml文件中的配置信息。

(3)内容(核心组件):

  • 全局上下文配置(全局配置参数)<context-param></context-param>。
  • Servlet配置
  • 过滤器配置
  • 监听器配置

(4)加载顺序:

  • web容器会按:ServletContext -> context-param -> listener -> filter -> servlet这个顺序加载组件,这些元素可配置在web.xml文件中的任意位置

5.加载时机:Web项目下的web.xml和Tomcat下的web.xml都是在服务器启动时加载的。

6.可以使用<welcome-file-list><welcome-file></welcome-file></welcome-file-list>标签配置默认的访问页面。

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">
    <welcome-file-list>
        <!--设置服务器启动时默认访问页面-->
        <welcome-file>welcome.html</welcome-file>
    </welcome-file-list>
</web-app>

四、server.xml文件

1.可以在里面设置服务器的访问端口。

2.可以在<Connector>标签中更改服务器端口。

五、JSP动态网页技术

1.概念:

(1)JSP全名为Java Server Pages,中文名叫java服务器页面,其根本是一个简化的Servlet设计,ta是由Sun Microsystems公司倡导、许多公司参与一起建立的一种动态网页技术标准。

2.动态网页:

(1)JSP部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成HTML、XML或其他格式文档的Web网页,然后返回给请求者。JSP技术以Java语言作为脚本语言,为用户的HTTP请求提供服务,并能与服务器上的其它Java程序共同处理复杂的业务需求。

3.特点:

(1)本质上还是Servlet。

(2)跨平台,一次编写到处运行。

(3)组件跨平台。

(4)健壮性和安全性。

4.JSP的访问原理:

(1)浏览器发起请求,请求JSP,请求被Tomcat服务器接收,执行JspServlet将请求的JSP文件转义成为对应的java文件(也是Servlet),然后执行转义好的java文件。

5.JSP的文档说明:

(1)格式:<%@ page contentType="text/html;charset=UTF-8" language="java" %>。

(2)contentType:文档响应的编码格式。

(3)language:使用的语言。

6.jsp实际运行文件:

(1)C:\Users\用户名\AppData\Local\JetBrains\IntelliJIdea2023.1\tomcat目录下的文件。

7.JSP文件运行原理:

(1)可以在Tomcat的web.xml中找到一个jsp的文件映射,就是servlet中的访问路径,当你访问*.jsp文件时会自动访问一个JspServlet,这个servlet会把jsp文件转译成一个servlet文件,最终在tomcat中运行的是这个转译后的servlet文件而不是之前的jsp文件,所以从始至终tomcat服务器根本就没有见过jsp这个文件。

8.JSP的语法和指令:

(1)page的作用:

  • 配置jsp文件的转译相关的参数。

(2)JSP的page指令介绍:

  • 案例:
java 复制代码
<%@ page contentType="text/html;charset=UTF-8"
         language="java" pageEncoding="UTF-8" import="java.util.Date,java.io.FileInputStream" session="true" errorPage="error.jsp"
%>
  • <%@ %>:包括jsp文件相关描述信息的标签,可以含有各种属性。
  • page属性:描述当前jsp文件。
  • contentType:当前文件响应编码等同于servlet中resp.setContentType。
  • language:表示当前jsp是用java语言作为脚本。
  • pageEncoding:表示当前jsp文件的编码,同时也是设置响应编码,与contentType有相同的效果,所以可以只写pageEncoding。
  • import="java.util.Date":用来导入java类的,如果有多个使用逗号隔开。
  • session:设置当前jsp页面是否支持session,默认不支持,session="true"开启session的支持。
  • errorPage:如果当前jsp页面有错,就会跳转到errorPage指定的页面。

9.JSP的三种注释:

(1)前端语言注释:<!-- 会被转译,也会被发送,但是不会被浏览器执行 -->。

(2)java语言注释://会被转译,但是不会被servlet执行。

(3)jsp注释:<%-- 不会被转译 --%>。

10.JSP中写Java代码的区域:

(1)<% 写在service方法中,局部的数据 %>

(2)<%! 全局的数据 %>

  • 注意:全局代码块声明的代码,需要使用局部代码块调用

(3)<%=变量或者方法名%>:脚本段,可以放在html标签中,相当于resp.getWriter().write();,会直接把脚本段中的内容写在前端页面中。

(4)嵌套:可以在一个局部代码块中写入一半的java代码,在局部代码下面加入一些html的内容,最后在html内容的下面使用局部代码块将剩余的java代码写完。

java 复制代码
<%
    for(int i = 0;i < 10;i++){
%>
<i><%=i%></i>
<%
    }
%>

(5)案例:

html 复制代码
<%--
  Created by IntelliJ IDEA.
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8"
         language="java" pageEncoding="UTF-8" import="java.util.Date,java.io.FileInputStream" session="true" errorPage="error.jsp"
%>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  <%--写java代码的区域,在service方法内:局部代码块--%>
  <%
//    System.out.println(10/0);
  %>
  <%--写java代码的区域,在service方法外:全局代码块--%>
  <%!
    int a = 10;
    int b = 20;
  %>
  <%
    System.out.println("a:" + a);
    System.out.println("a+b:" + (a + b));
  %>
    第一个jsp页面
  <a href="https://www.baidu.com">百度</a>
  <%--java代码可以与html代码混合写--%>
  <b>
    <%=b%>
    <br>
  </b>

  <%
    for(int i = 0;i < 10;i++){
  %>
  <i><%=i%></i><br>
  <%
    }
  %>
  </body>
</html>

11.JSP的静态引入和动态引入

(1)JSP的静态引入:<%@include file="要引入的jsp文件的相对路径"%>

  • 特点:会将引入的jsp文件和当前jsp文件转译成一个java(Servlet)文件使用。在网页中也就显示了合并后的显示效果。
  • 注意:静态引入的jsp文件不会单独转译成java(Servlet)文件。当前文件和静态引入的jsp文件中不能够使用java代码块声明同名变量。

(2)JSP的动态引入:<jsp:include page="要引入的jsp文件的相对路径"></jsp:include>

  • 特点:会将引入的jsp文件单独转译,在当前文件转译好的java文件中调用引入的jsp文件的转译文件。在网页中显示合并后的显示效果。
  • 注意:动态引入允许文件中声明同名变量。
  • 优点:降低jsp代码的冗余,便于维护升级。

(3)案例:

html 复制代码
<%--
  Created by IntelliJ IDEA.
  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>
    <%--静态引入--%>
    <%@include file="b.jsp"%>
    <hr>
    我是a.jsp页面
    <hr>
    <%@include file="c.jsp"%>
    <%--动态引入--%>
    <jsp:include page="d.jsp"></jsp:include>
</body>
</html>

12.JSP内置对象:

(1)可以通过jsp的内置对象request获取到后端Servlet中的request对象携带的数据。

(2)可以通过jsp的内置对象session获取到后端Servlet中在session中设置的数据。

六、EL表达式

1.什么是EL表达式:

(1)全称:Expression Language,一种写法非常简洁的表达式。语法简单易懂,便于使用。表达式语言的灵感来自于ECMAScript和XPath表达式语言,可以从作用域中取数据。

2.EL表达式的作用:

(1)作用:让jsp书写起来更加的方便。简化在jsp中获取作用域或者请求数据的写法。也会搭配jstl来进行使用。

3.使用EL表达式:

(1)语法结构:$(expression),提供.和[]两种运算符来存取数据。

4.使用EL表达式获取作用域数据:

(1)取的是pageContext、request、session、application四个对象中的数据,其他数据一概不理会。

(2)EL表达式如果找到了数据则获取返回,如果没有找到则什么也不做,也不报错。

5.EL表达式是为了简化咋们的jsp代码,具体一点就是为了简化在jsp里面写的那些java代码

(1)格式:${表达式}。

6.如果取存在作用域中的对象里面的属性,那么可以直接使用${key. 属性名}来获取

7.如果取存在作用域中List集合里面的数据,可以通过下标来取:${key[数据对应的下标,从0开始]}

(1)注意:如果集合中装的是对象,那么可以通过${key[下标].属性名}来获取。

8.如果取map集合中的数据,可以通过${session的key.map集合的key}来获取map集合中的数据

(1)注意:map集合的key不需要加双引号。

9.作用域对象有:

(1)request:一次请求中共享数据。

(2)session:同一用户下共享数据。

(3)application:不同用户下共享数据,整个工程中只有一个。

(4)pageContext:jsp中特有的,在当前页面中共享数据。

10.案例:

html 复制代码
<%--
  Created by IntelliJ IDEA.
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="com.web.pojo.T_User" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%
        request.setAttribute("city","北京");
    %>
    <%--取作用域中的数据--%>
    ${city}<br>
    <%
        session.setAttribute("city2","天津");
        T_User user = new T_User();
        user.setUname("小丽");
        user.setPwd("123");
        session.setAttribute("user",user);
        ArrayList<String> list = new ArrayList<>();
        list.add("上海");
        list.add("广州");
        list.add("南京");
        session.setAttribute("citys",list);
        HashMap<String,Integer> map = new HashMap<>();
        map.put("a",20);
        map.put("b",22);
        map.put("c",23);
        session.setAttribute("m",map);

        ArrayList<T_User> users = new ArrayList<>();
        users.add(new T_User("静静","123"));
        users.add(new T_User("小丽","333"));
        users.add(new T_User("海王","321"));
        session.setAttribute("users",users);
    %>
    ${city2}<br>
    ${user.uname}--${user.pwd}<br>
    ${citys[0]}--${citys[1]}--${citys[2]}<br>
    ${m.a}--${m.b}--${m.c}<br>
    ${users.get(0).uname}--${users.get(0).pwd}
    ${users.get(1).uname}--${users.get(1).pwd}
    ${users.get(2).uname}--${users.get(2).pwd}
    <hr>
    ${users[0].uname}--${users[0].pwd}<br>
    ${users[1].uname}--${users[1].pwd}<br>
    ${users[2].uname}--${users[2].pwd}<br>
    <h5>作用域对象有:request,session,application(ServletContext),pageContext</h5>
    在四种作用域中放入相同的数据
    <%
//        request.setAttribute("a","request");
        session.setAttribute("a","session");
        application.setAttribute("a","application");
//        pageContext.setAttribute("a","pageContext");
    %>
    <h5>测试优先顺序:application>request>session>application</h5>
    ${a}
</body>
</html>

七、jstl标签库学习

1.jstl提供了一些标签,可以在jsp页面中遍历取作用域中的数据。

2.在jsp中导入jstl的包:<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

3.使用<c:forEach items="{作用域中存储的要遍历的集合的key}" var="遍历出来的单个值的变量名"\>{"遍历出来的单个值的变量名"}</c:forEach>

4.案例:

html 复制代码
<%--
  Created by IntelliJ IDEA.
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" import="com.web.pojo.T_User,java.util.ArrayList" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<html>
<head>
    <title>Title</title>
</head>
<body>
    <%
		ArrayList<T_User> users = new ArrayList<>();
        users.add(new T_User("静静","123"));
        users.add(new T_User("小丽","333"));
        users.add(new T_User("海王","321"));
        session.setAttribute("users",users);
    %>
    <h3>jstl提供了一些标签,可以在jsp页面中--->遍历取作用域中的数据</h3>
    <c:forEach items="${users}" var="u">
        ${u.uname}--${u.pwd}<br>
    </c:forEach>
</body>
</html>
相关推荐
杨杨杨大侠2 小时前
Atlas Mapper 教程系列 (4/10):高级映射技巧与类型转换
java·开源·github
杨杨杨大侠2 小时前
Atlas Mapper 教程系列 (3/10):核心注解详解与基础映射
java·开源·github
tqs_123452 小时前
redis zset 处理大规模数据分页
java·算法·哈希算法
尚学教辅学习资料2 小时前
基于Spring Boot的家政服务管理系统+论文示例参考
java·spring boot·后端·java毕设
杨杨杨大侠2 小时前
Atlas Log 0.2.0 版本
java·github·apache log4j
快乐肚皮2 小时前
TransmittableThreadLocal:穿透线程边界的上下文传递艺术
java
渣哥2 小时前
别再无脑 synchronized 了!Java 锁优化的 7 个狠招
java
笨鸟笃行2 小时前
人工智能训练师三级备考笔记
笔记
Ro Jace2 小时前
文献阅读笔记:JAPCC2018年秋冬刊第27期期刊
笔记