目录
一、文件下载
1.文件下载的方式
(1)弹窗是使用附件的方式下载。
2.从服务器下载文件
(1)Content-Disposition是MIME协议的扩展,MIME协议指示MIME用户代理如何显示附加的文件。当Internet Explorer接收到头时,它会激活文件下载对话框。
(2)设置响应头:"Content-Disposition","attachment;filename="+filename。
3.案例:
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 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中的代码
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 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指令介绍:
- 案例:
<%@ 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代码写完。
<%
for(int i = 0;i < 10;i++){
%>
<i><%=i%></i>
<%
}
%>
(5)案例:
<%--
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)案例:
<%--
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.案例:
<%--
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.案例:
<%--
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>