Servlet-请求、响应及JSP基础
1 生命周期
1.1 创建Servlet
访问到对应地址的时候创建
1.2 执行init方法
可以执行一些初始化操作
1.3 Service()->doGet()/doPost()
1.4 destroy()
销毁的时候执行,可以进行释放资源操作
1.5 注意
如果希望容器一启动就创建servlet可以在web.xml配置
<load-on-startup>1</load-on-startup>
或者通过注解
@WebServlet(name = "student", urlPatterns = "/stu", loadOnStartup = 1)
2 Request
2.1 请求格式
可以在浏览器的网络(network)中查看请求的信息
请求的基本信息+请求头+请求体(post请求才有)
2.2 请求方式
2.2.1 Get请求
一般用于获取数据
请求参数在地址上
参数有大小限制(具体限制,由浏览器而定)
2.2.2 Post请求
一般用表单提交(一般用于新建)
请求参数可以在地址上也可以在请求体里
参数大小理论上没有限制
2.2.3 Delete请求
一般用于删除数据
2.2.4 Put请求
一般用于更新
2.2.5 Options请求
涉及到跨域的时候会用到
跨域请求的时候浏览器会先发一次嗅探请求,来询问服务器器是否允许跨域,这个嗅探请求的请求方式就是OPTIONS
2.3 常用API
request.getMethod()
request.getContextPath() 获取请求前缀
request.getParameter() 获取请求参数
reqeust.getRemoteHost() 获取远程的ip
request.getRequestURI() 获取请求地址
request.getHeader() 获取请求头数据
2.4 Post请求的发送和处理
2.4.1 发送
发送post请求可以通过postman进行发送,postman可以模拟各种类型的http请求,可以帮助我们进行接口测试
2.4.2 发送普通表单请求
servlet获取数据可以通过req.getParameter()获取参数
2.4.3 针对Json请求
2.4.3.1 发送
2.4.3.2 接收
BufferedReader bf = req.getReader();
StringBuilder stringBuilder = new StringBuilder();
while (true) {
String line = bf.readLine();
if (line == null) {
break;
}
stringBuilder.append(line);
}
System.out.println(stringBuilder.toString());
2.4.3.3 处理
fastjson是阿里提供的一个json处理的类库,可以处理Json数据
引入依赖。(通过maven仓库查找)
使用JSONObject对json字符串进行格式化
用起来和HashMap类似
2.5 Request域
可以把一些数据放到request域中,这些数据就可以在request请求中所共享
setAttribute()
getAttribute()
removeAttribute()
2.6 转发
可以通过request转发到别的内部资源,在转发的过程中同属于一个request域的
这种转发不会改变,浏览器上的地址的
只能转发到内部资源
转发属于一次请求,所以它们之间共享一个request域的
req.getRequestDispatcher("/stu").forward(req, resp);
3 Response
3.1 HTTP响应
3.1.1 响应头
Content-Type
Location 在状态码是302的时候,通过这个属性进行重定向
Set-Cookie: 服务端可以向客户端写入一些数据
3.1.2 响应体
服务端给客户端的响应
3.2 响应状态码
2xx
200 请求成功
3xx
302 进行重定向。重定向的地址是由响应头的Location决定的
304 读取缓存
4xx 请求有问题
400 参数服务器不能理解
401 没有登录
403 登录了但是没有权限
404 页面未找到。 请求地址写错了
405 请求方式不被允许 如:要求是get发送的是post
415 请求体格式不对。 如:要求是json格式的请求题,但是传了表单过去
5xx 服务端有问题
500 服务器内部错误
502 服务过载
3.3 常用API
setStatus() 返回的状态码
setHeader()设置响应头
setContentType() 响应体的类型
getWriter() 设置相应体
3.4 界面重定向
原理为设置状态为302 设置location为跳转的地址
resp.sendRedirect(req.getContextPath()+"/stu/manager");
注意地址:
绝对路径
协议://ip:端口号+地址
需要拼接项目的前缀
相对路径
去掉最后一个斜杠后面的内容加上地址
和forward跳转对比
重定向的特点:redirect
地址栏发生变化
重定向可以访问其他站点(服务器)的资源
重定向是两次请求。不能使用request对象来共享数据
转发的特点:forward
转发地址栏路径不变
转发只能访问当前服务器下的资源
转发是一次请求,可以使用request对象来共享数据
4 ServletContext
4.1 概念
代表整个web应用,可以和程序的容器(服务器)来通信
4.2 基本使用
// 通过this.getServletContext() 获取
// 通过req.getServletContext()
// 通过setAttribute 设置属性
this.getServletContext().setAttribute("list", new ArrayList<String>());
this.getServletContext().getAttribute("list");
this.getServletContext().removeAttribute("list");
在整个应用作用域中共享数据
5 数据初始化
5.1 设置Servlet初始化数据
通过配置文件
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.tledu.web_01.HelloServlet</servlet-class>
<init-param>
<param-name>initName</param-name>
<param-value>helloworld</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
通过注解
@WebServlet(name = "student", urlPatterns = "/stu", loadOnStartup = 1,initParams = {
@WebInitParam(name = "kkk",value = "对应的值")
})
5.2 获取数据
// 通过servletConfig获取
this.getServletConfig().getInitParameter("kkk")
6 JSP基础
6.1 作用
jsp本质上就是servlet
servlet编写前端代码不方便,在这里可以通过jsp进行前端代码编写,jsp专门编写前端代码
之前servlet前端和业务逻辑耦合在一起,不容易维护,这里通过jsp将业务逻辑和展示分开,方便维护
6.2 基础语法
<%! %>
在这个区域里编写代码是直接在servlet类里编写代码
可以在这里定义成员变量和方法
<%%>
在这里编写是在service()方法中编写
这里可以定义局部变量
<%=%>
可以直接输出到界面上
<%@ page %>
界面配置
contentType 页面类型
language 语言
errorPage 报错页面
import 可以导入别的包
6.3 两种包含
提取出来通用的代码
<%@include file=“include.jsp”%>
直接把对应的内容合并过来,最终编译成一个class文件
<jsp:include page=“include.jsp” />
分别编译,通过动态方式将对应的内容加载过来
6.4 九大内置对象
pageContext
request
session
application
response
page
config
out
exception