请求对象响应对象(RequestResponse)相关知识点

编程入门 行业动态 更新时间:2024-10-07 02:24:31

请求<a href=https://www.elefans.com/category/jswz/34/1771306.html style=对象响应对象(RequestResponse)相关知识点"/>

请求对象响应对象(RequestResponse)相关知识点

1.HTTP协议的概念

HTTP协议的介绍

HTTP的特点

HTTP请求

1.请求的组成部分

请求行
请求头
请求体

2.请求的方式

GET方式

POST方式

注意:只有post的请求方式才有请求体

2.HTTP请求的三个组成

请求行
请求头
请求体

3.请求信息的组成:请求行


1.请求方发:GTE和POST
2.URI 统一资源标识符
3.协议和版本号(HTTP/1.1)

4.请求信息的组成:请求头、请求体

请求头

请求头由多个键和值组成

请求体


小结

request对象介绍与作用

5.请求的方法:与请求行有关的方法【了解】

获取请求行的方法

package com.itheima;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;@WebServlet("/demo1")
public class Demo1RequestLineServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1.设置响应类型和编码response.setContentType("text/html;charset=utf-8");//2.获取打印流PrintWriter out = response.getWriter();//3.输出到浏览器:请求对象的实现类:org.apache.catalina.connector.RequestFacade@4ad64f2b//public class RequestFacade implements HttpServletRequest//结论:请求和响应对象由Tomcat实现,并且由Tomcat创建请求和响应对象,传入Servlet()方法中out.print("请求对象:" + request + "<hr/>");out.print("获取请求的方式:" + request.getMethod() + "<br/>");out.print("获取请求的URI:" + request.getRequestURI() + "<br/>");out.print("获取请求的URL:" + request.getRequestURL() + "<br/>");//得到url问号后面的数据out.print("获取查询字符串:" + request.getQueryString() + "<br/>");}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}
}

6.请求的方法:与请求头有关的方法

package com.itheima;import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;@WebServlet("/demo2")
public class Demo2RequestHeaderServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html;charset=utf-8");PrintWriter out = response.getWriter();out.print("请求对象:" + request + "<hr/>");//通过请求头的名字获取到请求头的值String header = request.getHeader("Host");out.print("host请求对象的值:" + header + "<br/>");//获取所有请求头的名字Enumeration<String> headerNames = request.getHeaderNames();//遍历所有的名字while (headerNames.hasMoreElements()) {//获取一个请求头的名字String s = headerNames.nextElement();//获取一个请求头的值String headerValue = request.getHeader(s);out.print("请求头的名字:" + s + ",请求头的值是:" + headerValue+"<hr/>");}String URI = request.getRequestURI();out.print("请求对象的URI是:" + URI + "<br/>");StringBuffer URL = request.getRequestURL();out.print("请求对象URL为:" + URL + "<br/>");String queryString = request.getQueryString();out.print("请求对象的值:" + queryString + "<br/>");}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1.设置响应类型和编码response.setContentType("text/html;charset=utf-8");//2.获取打印流PrintWriter out = response.getWriter();//3.输出到浏览器:请求对象的实现类:org.apache.catalina.connector.RequestFacade@4ad64f2b//public class RequestFacade implements HttpServletRequest//结论:请求和响应对象由Tomcat实现,并且由Tomcat创建请求和响应对象,传入Servlet()方法中out.print("请求对象:" + request + "<hr/>");out.print("获取请求的方式:" + request.getMethod() + "<br/>");out.print("获取请求的URI:" + request.getRequestURI() + "<br/>");out.print("获取请求的URL:" + request.getRequestURL() + "<br/>");//得到url问号后面的数据out.print("获取查询字符串:" + request.getQueryString() + "<br/>");}}

7.请求头应用案例:判断浏览器的类型

案例:判断用户使用的是什么浏览器

package com.itheima;import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;@WebServlet("/demo3")
public class Demo3BrowserServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1.设置响应类型和编码response.setContentType("text/html;charset=utf-8");//2.获取打印流PrintWriter out = response.getWriter();//获取user-agent这个请求头的值String header = request.getHeader("user-agent");//判断这个值是否包含指定的字符串"Edg,OPR,Chrome,Safari,Firefox,IE"或者其他if (header.contains("Edg")) {out.print("您的浏览器是微软自带的");} else if (header.contains("OPR")) {out.print("您的浏览器是OPR");} else if (header.contains("Chrome")) {out.print("您的浏览器是谷歌浏览器");} else if (header.contains("Safari")) {out.print("您的浏览器是苹果浏览器");} else if (header.contains("Firefox")) {out.print("您的浏览器是火狐浏览器");} else {out.print("您的浏览器是IE浏览器或者其他浏览器");}}}

8.请求的方法:得到客户端提交的参数值【重点】

获取请求数据

package com.itheima;import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.Map;@WebServlet("/demo4")
public class Demo4ParameterServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//设置响应类型和编码response.setContentType("text/html;charset=utf-8");//获取打印流PrintWriter out = response.getWriter();//1.获取用户名,参数的字符串必须与表单的name相同,获取一个参数值String name = request.getParameter("name");out.println("用户名是:" + name + "<br/>");String gender = request.getParameter("gender");out.println("性别是:" + gender + "<br/>");//2.通过一个参数名获取一组参数值String[] hobbys = request.getParameterValues("hobby");out.println("你的爱好是:" + Arrays.toString(hobbys) + "<br/>");//3.获取所有参数名Enumeration<String> parameterNames = request.getParameterNames();//遍历所有键的名字while (parameterNames.hasMoreElements()){//获取一个键的名字String s = parameterNames.nextElement();String headervalue = request.getParameter(s);out.println("参数名:"+s+"参数值:"+headervalue+"<hr>");}//4.获取整个表单所有的参数名和值 键:参数名,值:参数值(字符串数组)Map<String, String[]> parameterMap = request.getParameterMap();//遍历mapparameterMap.forEach((k,v)->out.println("键:"+k+",值:"+Arrays.toString(v)));}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}}

9.BeanUtils工具类的使用【重点】

BeanUtils工具类封装数据


Demo5BeanUtilsServlet.java文件

package com.itheima;import com.itheima.entity.User;
import org.apachemons.beanutils.BeanUtils;import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;@WebServlet("/demo5")
public class Demo5BeanUtilsServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1.设置响应类型和编码response.setContentType("text/html;charset=utf-8");//2.获取打印流PrintWriter out = response.getWriter();//设置汉字编码为utf-8request.setCharacterEncoding("utf-8");//获取表单所有的键和值Map<String, String[]> parameterMap = request.getParameterMap();User user = new User();//使用工具类封装数据,两个参数(目标对象(没有数据),源对象(有数据))try {BeanUtils.populate(user,parameterMap);} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}//输出out.println(user);}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}
}

User.java文件

package com.itheima.entity;public class User {private String name;private String gender;private String city;private String hobby;@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", gender='" + gender + '\'' +", city='" + city + '\'' +", hobby='" + hobby + '\'' +'}';}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}public String getCity() {return city;}public void setCity(String city) {this.city = city;}public String getHobby() {return hobby;}public void setHobby(String hobby) {this.hobby = hobby;}public User() {}public User(String name, String gender, String city, String hobby) {this.name = name;this.gender = gender;this.city = city;this.hobby = hobby;}
}

register.html文件

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>这是登录页面</title>
</head>
<body>
<h2>用户注册</h2>
<form action="demo5" method="post">用户名:<input type="text" name="name"/><br/>性别:<input type="radio" name="gender" value="男" checked="checked">男<input type="radio" name="gender" value="女">女<br/>城市:<select name="city"><option value="广州">广州</option><option value="深圳">深圳</option><option value="珠海">珠海</option></select><br/>爱好:<input type="checkbox" name="hobby" value="上网">上网<input type="checkbox" name="hobby" value="上学">上学<input type="checkbox" name="hobby" value="上车">上车<input type="checkbox" name="hobby" value="上吊">上吊<br/><input type="submit" value="注册">
</form></body>
</html>

记得放类库

在WEB_INF的包下新建lib存储

10.请求参数值汉字乱码的问题【重点】

解决post提交中文数据乱码

设置请求体汉字乱码

        //设置请求体的编码//1.1 必须放在所有获取参数方法的前面//1.2 必须与页面编码相同//1.3 get方法没有乱码的问题,这个方法用于post方法request.setCharacterEncoding("utf-8");

11.请求域有关的方法【重点】

request是一个作用域对象

三个作用域
在Servlet中一共有三个作用域从小到大为:请求域,会话域,上下文域.

12.页面的跳转:转发

One请求转发two

One.java页面

package com.itheima;import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;@WebServlet("/one")
public class OneServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//像请求域中添加键和值(向上转型)request.setAttribute("user", "NewBoy");
/*        //从请求域中通过键获取值(向下转型)String user = (String) request.getAttribute("user");//1.设置响应类型和编码response.setContentType("text/html;charset=utf-8");//2.获取打印流PrintWriter out = response.getWriter();out.println("请求域中的用户名:" + user);*///什么是转发:在服务器端进行的页面跳转//1.获取转发器(参数:要跳转的地址)2.通过转发器跳转(请求,响应)
/*        RequestDispatcher user = request.getRequestDispatcher("/two");user.forward(request,response);*///用一句话简写request.getRequestDispatcher("/two").forward(request,response);}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}
}

two.java页面

package com.itheima;import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;@WebServlet("/two")
public class TwoServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取请求域的值String user = (String) request.getAttribute("user");//1.设置响应类型和编码response.setContentType("text/html;charset=utf-8");//2.获取打印流PrintWriter out = response.getWriter();//打印到浏览器out.println("Two请求域中的对象:"+user);}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}
}

13.页面的跳转:重定向

        //重定向:在浏览器端进行页面跳转:一次请求两次跳转:无数据//request.getContextPath()获取模块的访问地址,如:/day28response.sendRedirect(request.getContextPath()+"/two");
    //重定向:在浏览器端进行页面跳转:一次请求两次跳转:无数据response.sendRedirect("/two");
package com.itheima;import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;@WebServlet("/one")
public class OneServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//像请求域中添加键和值(向上转型)request.setAttribute("user", "NewBoy");
/*        //从请求域中通过键获取值(向下转型)String user = (String) request.getAttribute("user");//1.设置响应类型和编码response.setContentType("text/html;charset=utf-8");//2.获取打印流PrintWriter out = response.getWriter();out.println("请求域中的用户名:" + user);*///什么是转发:在服务器端进行的页面跳转//1.获取转发器(参数:要跳转的地址)2.通过转发器跳转(请求,响应)
/*        RequestDispatcher user = request.getRequestDispatcher("/two");user.forward(request,response);*///用一句话简写//request.getRequestDispatcher("/two").forward(request,response);//重定向:在浏览器端进行页面跳转:一次请求两次跳转:无数据//request.getContextPath()获取模块的访问地址,如:/day28response.sendRedirect(request.getContextPath()+"/two");}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}
}

two.java页面

package com.itheima;import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;@WebServlet("/two")
public class TwoServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取请求域的值String user = (String) request.getAttribute("user");//1.设置响应类型和编码response.setContentType("text/html;charset=utf-8");//2.获取打印流PrintWriter out = response.getWriter();//打印到浏览器out.println("Two请求域中的对象:"+user);}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}
}

转发和重定向的区别

14.登录案例


分析

login1.html(HTML登录页面)

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>登录页面</title>
</head>
<body>
<form action="login1" method="post" ><br/><h2>用户登录</h2>用户名:<input type="text" name="username"><br/>密码:<input type="text" name="password"><br/><input type="submit" value="提交">
</form>
</body>
</html>

Login1Servlet文件(Servlet控制器处理数据)

package com.itheima;import com.itheima.entity.Users;import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;@WebServlet("/login1")
public class Login1Servlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1.设置汉字编码response.setCharacterEncoding("utf-8");//获取用户名和密码String username = (String) request.getParameter("username");String password = (String) request.getParameter("password");//比较用户名和密码,判断是否登录成功(以后访问数据库)if ("NewBoy".equals(username)&&"123456".equals(password)){//给对象封装属性Users users = new Users();users.setUsername(username);users.setPassworld(password);//登录成功以后将用户的信息保存在请求域中request.setAttribute("users",users);//转发到SuccessServlet中显示出来request.getRequestDispatcher("/success").forward(request,response);}else {//登陆失败,重定向到failure.htmlresponse.sendRedirect(request.getContextPath()+"/failure.html");}}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}
}

SuccessServlet页面(登录成功显示浏览器)

package com.itheima;import com.itheima.entity.Users;import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;@WebServlet("/success")
public class SuccessServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {Users users = (Users) request.getAttribute("users");//1.设置响应类型和编码response.setContentType("text/html;charset=utf-8");//2.获取打印流PrintWriter out = response.getWriter();//显示在页面上out.println("<h2>欢迎您登录成功:"+users.getUsername()+"<h2/>");}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}
}

failure.html文件(登录失败页面)

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>跳转失败</title>
</head>
<body>
<h2>登陆失败</h2>
<a href="login1.html">点击跳转重新登录</a>
</body>
</html>

总结

能够理解HTTP协议内容

能够使用Request对象获取HTTP协议的请求内容

获取请求数据

能够处理HTTP请求参数的乱码问题

能够使用request域对象

能够使用请求和转发


1.能够使用浏览器开发工具查看响应

HTTP响应

什么是HTTP响应

服务器端发送给浏览器端的数据,称为响应
1.响应的组成部分响应行(状态行)响应头响应空行响应体


200:表示服务器正常的响应
302:跳转/重定向
304:使用缓存
400:表示请求参数有问题
404:请求资源没找到
405:没有重写doGET或doPOST方法
500:服务器错误

响应头

响应体

小结

2.响应对象的方法:与状态码有关

package com.itheima;import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;@WebServlet("/demo1")
public class Demo1ResponseServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html;charset=utf-8");PrintWriter out = response.getWriter();out.println("响应对象:"+request);//设置状态码:这个方法很少单独使用(了解)//response.sendError(220);//发送错误码response.sendError(510,"你熬夜了吗?");}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}
}

3.响应头相关方法

案例:设置响应头过3秒跳转

package com.itheima;import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;@WebServlet("/demo2")
public class Demo2RefreshServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1.设置响应类型和编码response.setContentType("text/html;charset=utf-8");//2.获取打印流PrintWriter out = response.getWriter();out.println("过3秒后跳转到百度");//设置响应头,告诉浏览器跳转.值:多少秒;url=要跳转的地址response.setHeader("refresh","3;url=/?tn=21002492_48_hao_pg");}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}
}

案例:使用location实现页面跳转

package com.itheima;import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;@WebServlet("/demo3")
public class Demo3LocationServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//设置location响应头//response.setHeader("location", "index.jsp");//如果要跳转,还必须设置状态码为302//response.setStatus(302);//重定向进行跳转response.sendRedirect("index.jsp");}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}
}

案例:数据压缩



package com.itheima;import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.util.zip.GZIPOutputStream;@WebServlet("/demo4")
public class Demo4FzipServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//因为是一个压缩以后的数据,需要设置响应头,告诉浏览器自己解压以后再显示response.setHeader("content-encoding","gzip");//创建一个字符串StringBuilder sb = new StringBuilder();for (int i = 0; i < 5000; i++) {sb.append("sklhfdskfj");}//在服务器端输出没有压缩前的长度System.out.println("数据长度是:"+sb.length());//把字符串转换成字节数组byte[] data = sb.toString().getBytes("utf-8");//使用响应的对象的字节输出流输出ServletOutputStream out = response.getOutputStream();//out.write(data);//1.创建压缩流,在构造方法中指定参数,指定要压缩的流GZIPOutputStream gzipOutputStream = new GZIPOutputStream(out);//2.使用压缩的方法写数据gzipOutputStream.write(data);//3.结束输出,清除缓存gzipOutputStream.finish();}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}
}

4.响应体:处理响应乱码的问题


字符流:文本内容,如:html,css,js
字节流:二进制数据,如:图片

响应字符流汉字乱码问题

package com.itheima;import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;@WebServlet("/demo5")
public class Demo5EncodingServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//出现乱码的原因:字符流必须要指定编码,如果没有指定编码,默认tomcat使用ios-8859-1编码//请求对象也有同名方法,设置响应体编码//response.setCharacterEncoding("utf-8");//告诉浏览器服务器设置了编码是utf-8,你按utf-8解码,设置响应头:content-type//response.setHeader("content-type","text/html;charset=utf-8");//因为上面这个响应头使用过多,所以专门设置一个方法来设置这个响应头.同时这个方法又包含了response.setCharacterEncoding("utf-8")方法的作用response.setContentType("text/html;charset=utf-8");//直接获取字符流PrintWriter out = response.getWriter();out.println("疫情结束了");}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}
}

小结

5.ServletContext对象

上下文对象或上下文域

如何得到ServletContext对象

功能一:读取全局的配置参数


web.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns=""xmlns:xsi=""xsi:schemaLocation=" .xsd"version="4.0"><!--局部变量只能在当前的Servlet中--><servlet><!--servlet的名字--><servlet-name>demo1</servlet-name><!--自己写的servlet的类全名--><servlet-class>com.itheima.servlet.Demo1InitParamServlet</servlet-class><init-param><param-name>user</param-name><param-value>NewBoy</param-value></init-param></servlet><!--    2.配置访问地址--><servlet-mapping><!-- 指定servlet的名字,与上面的demo1的名字相同--><servlet-name>demo1</servlet-name><url-pattern>/demo1</url-pattern></servlet-mapping><!--    配置全局的初始化参数:给所有的Servlet使用--><context-param><param-name>name</param-name><param-value>张三</param-value></context-param><context-param><param-name>age</param-name><param-value>20</param-value></context-param>
</web-app>

Demo1InitParamServlet.java文件

package com.itheima.servlet;import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;public class Demo1InitParamServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//设置响应类型和编码response.setContentType("text/html;charset=utf-8");//获取打印流PrintWriter out = response.getWriter();//1.获取上下文对象这个方法从父类继承下来,定义在ServletConfig接口中ServletContext application = getServletContext();out.println("上下文对象"+application + "<hr/>");//读取web.xml中初始化参数---通过参数名获取参数值String user = getInitParameter("user");out.println("局部用户名:" + user + "<br>");//调用方法读取全局的配置参数String name = application.getInitParameter("name");String age1 = application.getInitParameter("age");out.println("全局姓名:" + name + ",年龄:" + age1 + "<hr/>");//获取所有全局的参数名称Enumeration<String> parameterNames = application.getInitParameterNames();while (parameterNames.hasMoreElements()){String names = parameterNames.nextElement();String value = application.getInitParameter(names);out.println("全局姓名:"+names+",年龄:"+value+"<br/>");}}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}
}

功能二:获取当前工程的资源


Demo2ResourceServlet.java文件

package com.itheima.servlet;import org.apachemons.io.IOUtils;import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;@WebServlet("/demo2")
public class Demo2ResourceServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取上下文对象ServletContext application = getServletContext();//使用方法读取web下的资源,转成字节输入流./ 代表web根目录,相当于web根目录InputStream IntputStream = application.getResourceAsStream("/WEB-INF/404.jpg");//获取响应的字节输出流ServletOutputStream outputStream = response.getOutputStream();//使用IO工具类,将输入流的数据写到输出流中IOUtils.copy(IntputStream, outputStream);}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}
}

功能三:获取资源在服务器的真实地址

package com.itheima.servlet;import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;@WebServlet("/demo3")
public class Demo3RealPathServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {ServletContext application = getServletContext();//1.设置响应类型和编码response.setContentType("text/html;charset=utf-8");//2.获取打印流PrintWriter out = response.getWriter();out.println("真实路径是:"+application.getRealPath("/WEB-INF/404.jpg")+"<br/>");}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}
}

小结:上下文对象的三个功能

上下文作用域

案例:得到当前是第几个登录的用户


统计第几个访问的用户

package com.itheima.servlet;import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;@WebServlet("/demo4")
public class Demo4CountServlet extends HttpServlet {@Overridepublic void init() throws ServletException {ServletContext application = getServletContext();application.setAttribute("count",0);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取上下文域对象ServletContext application = getServletContext();//从上下文域中获取count值;int count = (int) application.getAttribute("count");//加1在更新上下文域application.setAttribute("count",++count);//1.设置响应类型和编码response.setContentType("text/html;charset=utf-8");//2.获取打印流PrintWriter out = response.getWriter();String ip = request.getRemoteAddr();out.println("<h2>您是第:"+count+"个访问者ip地址是:"+ip+"<h2>");String format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());//输出到服务器上,getRemoteAddr()获取客户端的ipSystem.out.println(format+",访问的ip是:"+ip);}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}
}

6.文件下载

使用连接下载文件的不足

使用Servlet下载文件

汉字乱码的原理

文件下载案例

package com.itheima.servlet;import org.apachemons.io.IOUtils;import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.InputStream;
import java.URLEncoder;@WebServlet("/demo5")
public class Demo5DownloadServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//如果下载,使用设置一个响应头//content-disposition响应头有两个值:inline,在浏览器中打开;attachment,以附件的方式下载//建议不要使用汉字response.setHeader("content-disposition","attachment;filename="+ URLEncoder.encode("美女","utf-8")+".jpg");//获取上下文对象ServletContext application = getServletContext();//使用方法读取web下的资源,转成字节输入流./ 代表web根目录,相当于web根目录InputStream IntputStream = application.getResourceAsStream("/WEB-INF/404.jpg");//获取响应的字节输出流ServletOutputStream outputStream = response.getOutputStream();//使用IO工具类,将输入流的数据写到输出流中IOUtils.copy(IntputStream, outputStream);}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}
}

URL编码和解码

package com.itheima.code;import java.io.UnsupportedEncodingException;
import java.URLDecoder;
import java.URLEncoder;public class Demo1 {public static void main(String[] args) throws UnsupportedEncodingException {//URL编码和解码String str = "美女.jpg";//对字符串进行URL编码:参数:字符串,编码String encode = URLEncoder.encode(str, "utf-8");System.out.println("URL编码后:" + encode);//把编码后的字符串再进行解码String decode = URLDecoder.decode(encode);System.out.println("URL解码后:" + decode);}
}

小结

7.案例:使用三层架构添加书籍

需求分析

三层架构

数据库表的设计

项目结构


mybatis-config.xml配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis//DTD Config 3.0//EN"".dtd">
<configuration><settings><!--在控制台显示SQL语句--><setting name="logImpl" value="STDOUT_LOGGING"/></settings><!--定义实体类别名--><typeAliases><package name="com.itheima.entity"/></typeAliases><environments default="default"><!--环境变量--><environment id="default"><!--事务管理器--><transactionManager type="JDBC"/><!--数据源--><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/db3"/><property name="username" value="root"/><property name="password" value="1234"/></dataSource></environment></environments><!--    加载其他的映射文件--><mappers><package name="com.itheima.dao"/></mappers>
</configuration>

utils下MyBatisUtils工具类

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis//DTD Config 3.0//EN"".dtd">
<configuration><settings><!--在控制台显示SQL语句--><setting name="logImpl" value="STDOUT_LOGGING"/></settings><!--定义实体类别名--><typeAliases><package name="com.itheima.entity"/></typeAliases><environments default="default"><!--环境变量--><environment id="default"><!--事务管理器--><transactionManager type="JDBC"/><!--数据源--><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/db3"/><property name="username" value="root"/><property name="password" value="1234"/></dataSource></environment></environments><!--    加载其他的映射文件--><mappers><package name="com.itheima.dao"/></mappers>
</configuration>

dao中的持久层

impl中BookDaoImpl.java文件
package com.itheima.dao.impl;import com.itheima.dao.BookDao;
import com.itheima.entity.Book;
import com.itheima.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;public class BookDaoImpl implements BookDao {/*** 添加书籍** @param book 封装了所有的属性值* @return*/@Overridepublic int saveBook(Book book) {//1.通过工具类获得会话对象SqlSession session = MyBatisUtils.getSession();//2.创建Dao接口的代理对象BookDao bookDao = session.getMapper(BookDao.class);//3.调用代理对象的方法,实现添加的操作int row = bookDao.saveBook(book);//4.提交事务sessionmit();//5.关闭事务session.close();return row;}
}
dao包中BookDao接口
package com.itheima.dao;import com.itheima.entity.Book;
import org.apache.ibatis.annotations.Insert;/*** 书籍的持久层接口*/
public interface BookDao {/*** 添加书籍* @param book 封装了所有的属性值* @return*/@Insert("insert into book value(null,#{name},#{author},#{time},#{type})")int saveBook(Book book);
}

entity实体类Book文件``

package com.itheima.entity;import java.sql.Date;public class Book {private int id;private String name;private String author;private Date time;  //使用java.sql.Date类型,以前学的java.util.Dateprivate int type;@Overridepublic String toString() {return "Book{" +"id=" + id +", name='" + name + '\'' +", author='" + author + '\'' +", time=" + time +", type=" + type +'}';}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}public Date getTime() {return time;}public void setTime(Date time) {this.time = time;}public int getType() {return type;}public void setType(int type) {this.type = type;}public Book(int id, String name, String author, Date time, int type) {this.id = id;this.name = name;this.author = author;this.time = time;this.type = type;}public Book() {}
}

service业务层中的impl

BookServiceImpl文件
package com.itheima.service.impl;import com.itheima.dao.BookDao;
import com.itheima.dao.impl.BookDaoImpl;
import com.itheima.entity.Book;
import com.itheima.service.BookService;public class BookServiceImpl implements BookService {private BookDao bookDao=new BookDaoImpl();/*** 添加书籍** @param book :书籍对象* @return 影响行数*/@Overridepublic int addBook(Book book) {return bookDao.saveBook(book);}
}
BookService接口
package com.itheima.service;import com.itheima.entity.Book;/*** 书籍业务层*/
public interface BookService {/*** 添加书籍* @param book:书籍对象* @return 影响行数*/int addBook(Book book);
}

servlet控制器AddBookServlet

package com.itheima.servlet;import com.itheima.entity.Book;
import com.itheima.service.BookService;
import com.itheima.service.impl.BookServiceImpl;
import org.apachemons.beanutils.BeanUtils;import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Enumeration;
import java.util.Map;@WebServlet("/addbook")
public class AddBookServlet extends HttpServlet {//调用业务层访问后面的东西private BookService bookService=new BookServiceImpl();@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//汉字编码request.setCharacterEncoding("utf-8");//获取表单提交的所有数据Map<String, String[]> parameterMap = request.getParameterMap();//创建一个书籍对象Book book = new Book();//复制属性try {BeanUtils.populate(book,parameterMap);} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}//调用业务层添加书籍int row = bookService.addBook(book);if (row>0){//添加成功跳转到的页面response.sendRedirect(request.getContextPath()+"/success.html");}else {//跳转到添加失败的页面response.sendRedirect(request.getContextPath()+"/failure.html");}}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}
}

简易的index登录页面

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width. initial-scale=1"><title>添加书籍</title><link href="css/bootstrap.min.css" rel="stylesheet"><script src="js/jquery-3.2.1.min.is"></script><script src="js/bootstrap.min.js"></script><script type="text/javascript"></script>
</head>
<body>
<div class="container" style=""><h2>添加书籍</h2><form action="addbook" method="post" id="bookForm"><div class="form-group"><label for="name">图书名称</label><input type="text" name="name" id="name" class="form-control" placeholder="请输入书籍名称"/></div><div class="form-group"><label for="name">图书作者</label><input type="text" name="author" id="author" class="form-control" placeholder="请输入作者"/></div><div class="form-group"><label for="name">购买日期</label><input type="date" name="time" id="time" class="form-control" placeholder="请输入购买日期"/></div><div class="form-group"><label for="name">图书类别</label><select name="type" id="type" class="form-control"><option value="0">--请选择--</option><option value="1">计算机</option><option value="2">小说</option><option value="3">杂项</option></select></div><div><input type="submit" value="增加图书" class="btn btn-success"></div></form>
</div>
</body>
</html>

success.html登录成功页面

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>添加成功</title>
</head>
<body>
<h2>添加成功</h2>
<a href="index.html">再添加一条</a>
</body>
</html>

小结

HTTP响应的格式

能够理解常见的状态码

能够使用Response对象操作HTTP响应内容

能够处理 响应乱码

能够完成文件下载的案例

ServletContext作用域对象

更多推荐

请求对象响应对象(RequestResponse)相关知识点

本文发布于:2024-02-28 08:31:27,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1769083.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:对象   知识点   RequestResponse

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!