目录
3、Servlet
3.1、Servlet简介
Servlet就是sun公司开发动态web的一门技术
- 只要实现Servlet接口的类,就是Servlet,我们想要开发一个Servlet程序,只需要完成两个步骤:
- 编写一个类,实现Servlet接口
- 把开发好的java类部署到web服务器中
3.2、HelloServlet
这里关于Servlet在之前写过一篇博客,就不重复写了
3.3、Mapping问题
1. 一个Servlet可以指定一个映射路径
<servlet>
<servlet-name>Hello</servlet-name>
<servlet-class>com.zhang.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
2.一个Servlet可以指定多个映射路径
<servlet>
<servlet-name>Hello</servlet-name>
<servlet-class>com.zhang.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/hello1</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/hello2</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/hello3</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/hello4</url-pattern>
</servlet-mapping>
3.一个Servlet可以指定通用映射路径
<servlet>
<servlet-name>Hello</servlet-name>
<servlet-class>com.zhang.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/hello/*</url-pattern>
</servlet-mapping>
4、默认请求路径
<servlet>
<servlet-name>Hello</servlet-name>
<servlet-class>com.zhang.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
5、指定一些后缀或者前缀等等
<!--可以自定义后缀实现请求映射
注意点,*前面不能加项目映射的路径
hello/aaa.zhang
-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>*.zhang</url-pattern>
</servlet-mapping>
6、优先级问题
指定了固有的映射路径优先级最高,如果找不到就会走默认的处理请求
3.4、ServletContext
当Servlet容器启动时候,会为每一个web应用创建唯一个的ServletContext 对象代表当前web应用,这个对象不仅封装了当前web应用的所有信息,而且实现了多个Servlet之间的的数据共享。
1、数据共享
在helloServlet中存数据
package com.zhang.servlet;
import javax.servlet.ServletContext;
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 HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//this.getInitParameter(); 初始化参数
//this.getServletConfig(); 配置信息
//this.getServletContext() 上下文
ServletContext servletContext = this.getServletContext();
servletContext.setAttribute("name","小张");//数据
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
在getServlet中取到数据并设置相应格式编码返回前端
package com.zhang.servlet;
import javax.servlet.ServletContext;
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 GetServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = this.getServletContext();
//获得在helloServlet中存放的数据
Object name = servletContext.getAttribute("name");
//设置响应格式
resp.setContentType("text/html");
//设置响应编码
resp.setCharacterEncoding("utf-8");
resp.getWriter().println(name);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
要记得每写一个Servlet都需要在web.xml中去配置他
<servlet>
<servlet-name>Hello</servlet-name>
<servlet-class>com.zhang.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>Getcon</servlet-name>
<servlet-class>com.zhang.servlet.GetServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Getcon</servlet-name>
<url-pattern>/get</url-pattern>
</servlet-mapping>
这个时候可以启动tomcat并测试了,配置tomcat的步骤可以参考以下
Maven Webapp项目中配置Tomcat_长安也有星星的博客-CSDN博客_maven tomcat webappMaven Webapp项目中配置Tomcat,还有在配置tomcat中遇到的一些问题,以及web.xml配置文件,pom.xml配置文件https://blog.csdn.net/weixin_71614127/article/details/126044368启动服务器后会跳转到index.jsp文件,这时候在url栏的地址后边输入/hello(这个是上面我配置的,可能会不一样),按回车,数据就存到上下文中去了,然后把/hello删掉,输入/get ,就能看到会显示出我们存的数据了。
2、初始化参数
配置一些初始化参数
<context-param>
<param-name>mysql</param-name>
<param-value>jdbc:mysql://localhost:3306/jdbc</param-value>
</context-param>
获得初始化参数
public class GetParameterServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html");
//设置响应编码
resp.setCharacterEncoding("utf-8");
resp.getWriter().println(this.getServletContext().getInitParameter("mysql"));
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
配置servlet,mapping
<servlet>
<servlet-name>GetParameterServlet</servlet-name>
<servlet-class>com.zhang.servlet.GetParameterServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>GetParameterServlet</servlet-name>
<url-pattern>/getp</url-pattern>
</servlet-mapping>
重启服务,测试
3、请求转发
public class ForwardServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("进入了请求转发的Servlet");
//获取上下文容器,然后获得请求转发的路径,调用forward实现转发
//我们配置这个servlet,后台会输出进入了请求转发的Servlet,但是前端页面会被转发到我们刚才写的获取初始化参数的页面
this.getServletContext().getRequestDispatcher("/getp").forward(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
web.xml
<servlet>
<servlet-name>ForwardServlet</servlet-name>
<servlet-class>com.zhang.servlet.ForwardServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ForwardServlet</servlet-name>
<url-pattern>/fs</url-pattern>
</servlet-mapping>
重启测试
3.5、HttpResponse
web服务器在接受到客户端的http请求后 ,会创建一个HttpServletRequest和一个HttpServletResponse对象,前者代表请求,后者代表相应。
- 要获取前端的一些参数就找HttpServletRequest
- 要相应给前端信息就找HttpServletResponse
1、简单分类
负责向浏览器发送数据的对象
ServletOutputStream servletOutputStream;
PrintWriter printWriter;
负责向浏览器发送响应头的方法
响应状态码
2、下载文件
public class DownloadServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1、获取要下载文件的路径
String path = "E:\\JavaProject\\javaWeb-Study\\javaweb-01-servlet\\src\\main\\resources\\image\\头像.jpg";
//2、下载的文件名是啥
String filename = path.substring(path.lastIndexOf("\\")+1);
//3、让浏览器支持我们要下载的东西,中文文件名可能会乱码,这个上网查,难记
resp.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(filename,"UTF-8"));
//4、获取下载文件的的输入流
FileInputStream is = new FileInputStream(path);
//5、创建缓冲区
int len = 0;
byte[] buffer = new byte[1024];
//6、获取OutputStream对象
ServletOutputStream os = resp.getOutputStream();
//7、使用FileOutputString流将文件写入到缓冲区
//8、使用OutputStream将缓冲区的数据输出到客户端
while ((len = is.read(buffer))>0){
os.write(buffer,0,len);
}
is.close();
os.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
web.xml
<servlet>
<servlet-name>DownloadServlet</servlet-name>
<servlet-class>com.zhang.servlet.DownloadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DownloadServlet</servlet-name>
<url-pattern>/ds</url-pattern>
</servlet-mapping>
测试
3 、实现重定向
当客户端发起一个请求去访问web的a资源后,然后a资源会告诉客户端去找b资源,这个过程叫重定向
重定向与转发的区别
- 相同点
- 页面都会实现跳转
- 不同点
- 请求转发的url地址栏不会发生变化
- 重定向的url地址栏会发生变化
简单实现请求重定向
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println("username:"+username+"===password"+password);
//这里要特别注意转发的路径这里因为我配置的时候没有加项目名,所以直接页面,如果有项目名,就是/项目名/sucess.jsp
resp.sendRedirect("/sucess.jsp");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/login">
用户名:<input type="text" name="username"><br/>
密码:<input type="text" name="password"><br/>
<input type="submit">
</form>
</body>
</html>
success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>登录成功</h1>
</body>
</html>
web.xml
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.zhang.servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
测试
填写表单点提交会跳转成功页面,后台还会输出
3.6、HttpServletRequest
通过HttpServletRequest对象我们可以获得前端传过来的信息
可以实现请求转发
括号里就是要转发的路径!