1.tomcat会根据url的请求的资源路径,创建Servlet对象
2.tomcat会创建request和response对象传递给service方法,并调用service
service(servletRequest,servletResponse)
3.通过request对象获取请求的消息数据
通过response对象获取响应的消息数据
HttpServlet:doGet(HttpServletRequest req,HttpServlet resp),doPost(HttpServletRequest req,HttpServlet resp)
req和resp作为定义的接口没有自己定义实现类,具体的实现是由服务器来完成的,服务器实现了req和resp。
Request对象的继承体系结构:ServletRequst<---继承---HttpServletRequest<---实现---org.apache.catalina.connector.RequestFacade
Request功能:
1.获取请求消息(HTTP报文)数据
获取请求方法:getMethod(),如GET,POST
获取虚拟路径:getContextPath(),如/XXXX,如果为"/"则为空
获取servlet路径:getServletPath(),如/demo1
获取get方式的请求参数:String getQueryString(),如name=zhangsan
获取请求的uri:String getRequestURI,如/demo1
获取请求的url:StringBuffer getRequestURL,http://localhost:8080/demo1
获取协议和版本:String getProtocol()
获取客户机的IP地址:String getRemoteAddr()
......
System.out.println(req.getMethod());
System.out.println(req.getContextPath());
System.out.println(req.getServletPath());
System.out.println(req.getQueryString());
System.out.println(req.getRequestURI());
System.out.println(req.getRequestURL());
System.out.println(req.getRemoteAddr());
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
System.out.println("Get访问");
Enumeration<String> headNames=req.getHeaderNames();
while(headNames.hasMoreElements()){
String name=headNames.nextElement();
System.out.println(name);
String value=req.getHeader(name);
System.out.println(value);
}
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
String agent = req.getHeader("user-agent");
if(agent.contains("Chrome")){
System.out.println("我这是用的谷歌浏览器。");
}
String referer = req.getHeader("referer");
System.out.println(referer);
if(referer.contains("localhost")){
System.out.println("不错,是本机访问的");
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().write("不错,你是本机访问的。");
}else{
System.out.println("居然敢盗链!!!");
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().write("盗链?不行!");
}
}
请求体:只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数
步骤:
1.获取流对象
BufferedReader getReader():获取字符输入流,只能操作字符数据
ServletInputStream getInputStream():获取字节输入流,可以操作所有类型的数据
2.从流对象中拿数据
BufferedReader.readLine()
html样例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册页面</title>
</head>
<body>
<form action="/demo04" method="post">
<input type="text" placeholder="请输入用户名" name="username"><br>
<input type="password" placeholder="请输入密码" name="password"><br>
<input type="submit" value="注册">
</form>
</body>
</html>
demo4 doPost():
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
//获取请求消息体
//1.获取字符流
BufferedReader br = req.getReader();
//读取数据
String line = null;
while((line = br.readLine())!=null){
System.out.println(line);
}
}
其他功能:
获取请求参数的通用方式:不论get和post都可以使用以下的方法
String getParameter(String name):根据参数名称获取参数值,如username=zhangsan&password=boynextdoor,如果一个参数名对应多个参数,则仅取一个参数作为值
String[] getParameterValues(String name):根据参数名称获取参数值的数组,如hobby=sing&hobby=dance,对应组件如checkbox
Enumeration<String> getParameterNames():获得提交的所有参数名
Map<String,String[]> getParameterMap():获取所有参数的map集合
中文乱码问题:
get方式不会引起表单提交的中文乱码
post方式会乱码
解决方法:设置post字符流的编码
req.setCharacterEncoding("utf-8");
则解决乱码问题
super.doGet(),super.doPost()未删除报错
选中方法,ctrl+alt+H查看源码:
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String protocol = req.getProtocol();
String msg = lStrings.getString("http.method_post_not_supported");
if (protocol.endsWith("1.1")) {
resp.sendError(405, msg);
} else {
resp.sendError(400, msg);
}
}
一种在服务器内部资源跳转的方式
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
RequestDispatcher requestDispatcher = req.getRequestDispatcher("/demo05");
requestDispatcher.forward(req,resp);
}
1.请求转发功能不会引起浏览器地址路径的改变
2.服务器内部资源跳转的方式,不能访问服务器外部资源
3.转发是一次请求(浏览器抓包仅1个包),请求为当前地址路径的请求
1.域对象:一个有作用范围的对象,可以在范围内共享数据
request域:代表一次请求
方法:
1>setAttribute(String name,Object obj):存储数据
2>Object getAttribute(String name):通过键获取值
3>removeAttribute(String name):通过键移除键值对
这个功能一般用于请求转发中多个资源的共享
示例:
demo07
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//存储数据到request域中
req.setAttribute("msg","hello");
System.out.println("demo07被访问了");
RequestDispatcher requestDispatcher = req.getRequestDispatcher("/demo05");
requestDispatcher.forward(req,resp);
}
demo05
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("demo05被访问了");
req.setCharacterEncoding("utf-8");
String msg = (String) req.getAttribute("msg");
System.out.println(msg);
}
ServletContext getServletContext()
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。