Java Servlet
请求
请求行 方式 uri http/1.1
请求头
请求体
form表单标签提交Get请求时,参数以键值对形式放在url后,不放在请求体里,Get方式的请求也是可以有请求体的
Post请求时,放在请求头里面
Servlet (server applet) 是运行在服务端(tomcat)的Java小程序,是sun公司提供一套定义动态资源规范; 从代码层面上来讲Servlet就是一个接口
- 用来接收、处理客户端请求、响应给浏览器的动态资源。在整个Web应用中,Servlet主要负责接收处理请求、协同调度功能以及响应数据。我们可以把Servlet称为Web应用中的控制器
package cn.nanchengyu.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* ClassName: UserServlet
* Package: cn.nanchengyu.servlet
* Description:
*
* servlet开发流程
* 1.创建Javaweb项目,同时将tomcat添加为当前项目的依赖
* 2.重写service方法,service(HttpServletRequest req, HttpServletResponse resp)
* 3.在service方法中,定义业务处理代码
* 4.在web.xml中配置Servlet对应的请求映射路径
* @Author 南城余
* @Create 2023/11/20 11:26
* @Version 1.0
*/
public class UserServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1.从request对象中获取请求中的任何信息(username参数)
String username = request.getParameter("username");
// 2.处理业务代码
String info = "yes";
if("nanchengyu".equals(username)){
info = "no";
}
// 3.将响应的数据放入response中
// 应该设置Content-Type响应头
response.setHeader("Content-Type","text/html");
PrintWriter writer = response.getWriter();
writer.write(info);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
version="5.0">
<servlet>
<!--给UserServlet起一个别名-->
<servlet-name>userServlet</servlet-name>
<servlet-class>com.atguigu.servlet.UserServlet</servlet-class>
</servlet>
<servlet-mapping>
<!--关联别名和映射路径-->
<servlet-name>userServlet</servlet-name>
<!--可以为一个Servlet匹配多个不同的映射路径,但是不同的Servlet不能使用相同的url-pattern-->
<url-pattern>/userServlet</url-pattern>
<!-- <url-pattern>/userServlet2</url-pattern>-->
<!--
/ 表示通配所有资源,不包括jsp文件
/* 表示通配所有资源,包括jsp文件
/a/* 匹配所有以a前缀的映射路径
*.action 匹配所有以action为后缀的映射路径
-->
<!-- <url-pattern>/*</url-pattern>-->
</servlet-mapping>
</web-app>
xml大段编写太过麻烦,一般采用@WebServlet注解源码
@WebServlet(
name = "userServlet",
//value = "/user",
urlPatterns = {"/userServlet1","/userServlet2","/userServlet"},
initParams = {@WebInitParam(name = "encoding",value = "UTF-8")},
loadOnStartup = 6
)
public class UserServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String encoding = getServletConfig().getInitParameter("encoding");
System.out.println(encoding);
// 获取请求中的参数
String username = req.getParameter("username");
if("atguigu".equals(username)){
//通过响应对象响应信息
resp.getWriter().write("NO");
}else{
resp.getWriter().write("YES");
}
}
}
servlet生命周期
- 实例化 构造器 第一次请求 1
- 初始化 init 构造完毕 1
- 接受请求 service 每次请求 每刷新一次+1
- 销毁 destory 关闭服务 1
Servlet在tomcat中是单例的
servlet的成员变量在多个线程中是共享的
不建议在service方法中修改成员变量
继承HttpServlet后,要么重写service方法,要么重写doGet/doPost方法
ServletConfig和ServletContext
ServletConfig是什么
- 为Servlet提供初始配置参数的一种对象,每个Servlet都有自己独立唯一的ServletConfig对象
- 容器会为每个Servlet实例化一个ServletConfig对象,并通过Servlet生命周期的init方法传入给Servlet作为属性
ServletContext是什么
- ServletContext对象有称呼为上下文对象,或者叫应用域对象(后面统一讲解域对象)
- 容器会为每个app创建一个独立的唯一的ServletContext对象
- ServletContext对象为所有的Servlet所共享
- ServletContext可以为所有的Servlet提供初始配置参数
请求转发和响应重定向
什么是请求转发和响应重定向
- 请求转发和响应重定向是web应用中间接访问项目资源的两种手段,也是Servlet控制页面跳转的两种手段
- 请求转发通过HttpServletRequest实现,响应重定向通过HttpServletResponse实现
- 请求转发生活举例: 张三找李四借钱,李四没有,李四找王五,让王五借给张三
- 响应重定向生活举例:张三找李四借钱,李四没有,李四让张三去找王五,张三自己再去找王五借钱
请求转发特点
- 请求转发是通过HttpServletRequst对象实现的
- 请求转发只产生一次请求 服务器只产生了一对request和response对象
- 请求转发是服务器内部行为,对客户端是屏蔽的
- 客户端的地址栏是不变的
- 请求的参数是可以继续从传递的
- 目标资源可以是servlet动态资源,也可以是HTML静态资源
- 目标资源可以是WEB-INF下受保护的资源,该方式也是WEB-INF下资源的唯一访问方式
- 请求转发不可以是外部资源
响应重定向特点
302重定向
- 重定向是通过HttpServletRespose对象的sendRedirect方法实现的
- 响应重定向是在服务器提示下的,客户端行为
- 客户端的地址栏是变化的
- 客户端至少发送了两次请求, 也可以产生多次请求
- 请求产生了多次 后端就会有多个request对象 此时请求中的参数不能继续自动传递
- 目标资源可以是视图资源(即图片文字等)
- 目标资源不可以是WEB-INF资源
- 目标资源可以是外部资源
如果两种方式都可以完成页面跳转,优先考虑重定向
乱码问题(get和post)
相对路径和绝对路径
相对路径
以当前资源的所在路径为出发点去找目标资源
语法:
不以/开头
./表示当前资源的路径
../表示当前资源的上一层路径
绝对路径
始终以固定的路径作为出发点去找目标资源 和当前资源的所在路径没有关系
语法
以/开头
不同的项目中,固定的路径出发点可能不一致,可以测试一下 http://localhst:8080/demo5/static/img/logo.png
解决上述问题
一般采用绝对路径加不设置项目路径上下文