重要:
1.响应状态码
Servlet
Servlet时java实现客户端与服务器交互的主要机制
上下文路径
使用Servlet需要实现Servilt包,然后重写里面的方法
重写后有这几个方法: 1.init:表示初始化Servlet
2.service:具体的业务操作
3.destroy:Servlet对象的销毁方法
映射Servlet
启动顺序
默认条件下 Servlet第一次访问时创建 如果修改为tomcat服务器启动时创建
一个servlet对应一个url地址,需要优化
Servlet注解
问题: 一个servlet对应8行web.xml的配置,这样配置比较繁琐,建议使用注解模式 注解: @WebServlet name属性: 默认值在运行期自动变成 包名.类名 urlPatterns/value属性: 可以映射多个请求路径(实用性不强,换为value)
@WebServlet(name = "MsgServlet",urlPatterns = {"/xxx","/xxxxx","/xxxx"})
如果使用注解中只有一个属性,则value可以不写
HttpServlet:
根据用户不同的请求类型调用不同的业务方法
//该service方法会被自动的调用!!!!
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//调用的是其中的service方法
//获取请求的方式 get/post/put/delete/........
//req.getMethod() 获取请求的类型
String method = req.getMethod();
if (method.equals("GET")){
this.doGet(req, resp);
}else if (method.equals("POST")) {
this.doPost(req, resp);
}......
}
}
package com.atguigu.servlet;
import jakarta.servlet.GenericServlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/myHttp")
public class MyHttpServlet extends HttpServlet {
/**
* 下列的方法需要自己完成
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("hello get");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("hello post");
}
HttpServletRequest
前端提交数据,后端通过getParameter方式获取参数
如果返回多个同名数据,则可以使用getParameterValues
HttpServletResponse
服务器响应客户端时,封装了相应报文的对象
//5.测试响应数据
//5.1 添加响应码
resp.setStatus(404);
//5.2添加响应数据
resp.setHeader("name","response");
//5.3解决乱码问题
//resp.setCharacterEncoding("GBK");
//5.4 字符集编码: utf-8 浏览器默认使用GBK编码格式 要求浏览器指定编码解析数据
resp.setContentType("text/html;charset=utf-8");
//resp.getWriter().write("你好我是服务器数据");
resp.sendError(404,"页面走丢了");
转发与重定向
转发:
req.getRequestDispatcher("/要转发到的地址").forward(req,resp);
由AServlet访问BServlet的过程叫做转发,A和B都存在于服务器内部
Aservlet
package com.atguigu.servlet;
import jakarta.servlet.*;
import jakarta.servlet.http.*;
import jakarta.servlet.annotation.*;
import java.io.IOException;
@WebServlet(name = "AServlet", value = "/aServlet")
public class AServlet extends HttpServlet {
/**
* AServlet和BServlet都位于服务器内部
* 转发: 由A访问B的过程叫做转发
* 内部:
* http://localhost:8080/上下文/aServlet
* http://localhost:8080/上下文/bServlet
* 规则: 在服务器内部 从/开始 /代表服务器的根
*/
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("访问AServlet");
String name = req.getParameter("name");
System.out.println("参数:"+name);
System.out.println("开始转发操作");
//转发路径 服务器运行的源码是字节码, out下的路径
req.getRequestDispatcher("/bServlet").forward(req,resp);
}
}
BServlet
package com.atguigu.servlet;
import jakarta.servlet.*;
import jakarta.servlet.http.*;
import jakarta.servlet.annotation.*;
import java.io.IOException;
@WebServlet(name = "BServlet", value = "/bServlet")
public class BServlet extends HttpServlet {
//url: http://localhost:8080/上下文/bServlet
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("访问BServlet");
String name = req.getParameter("name");
System.out.println("客户端数据:"+name);
//设置页面响应的字符串编码
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().write("服务器响应成功");
}
}
WEB-INF下的资源只能通过转发获取
响应重定向
缺少上下文路径 所以补齐.
resp.sendRedirect(req.getContextPath()+“/重定向路径”)
package com.atguigu.servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "EServlet", value = "/eServlet")
public class EServlet extends HttpServlet {
//http://localhost:8080/上下文/eServlet
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String name = req.getParameter("name");
System.out.println("获取参数E:"+name);
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().write("重定向成功!!!");
}
}
重定向发起了多次请求,多次响应 request和response是多个 所以不能传递参数 重定向是浏览器行为 解析/ 只代表主机地址 如:http://localhost:8080 缺少上下文路径 所以补齐. 重定向操作地址变化..
旧业务结束,新业务开始 使用重定向 如果业务还有延续 使用转发
推荐文章
发表评论