HttpServletRequest(请求)
HttpServletResponse(响应)
web服务器接收到客户端的http请求,针对这个请求分别创建一个代表请求的HttpServletRequest对象,一个代表响应的HttpServletResponse对象;
如果要获取客户端请求过来的参数:找HttpServletRequest
如果要给客户响应一些信息:找HttpServletResponse
简单分类
负责向浏览器发送数据的方法:ServletoutputStream getoutputStream() throws IOException;
PrintWriter getWriter() throws IOException;
常见应用:向浏览器输出消息,
下载文件:
获取下载文件路径
下载的文件名是什么
设置想办法让浏览器能够支持(Content-disposition)下载我们需要的东西
获取下载文件的输入流
创建缓冲区
获取OutputStream对象
将FileOutStream流写入到Buffer缓冲区
使用OutputStream将缓冲区中的数据输出到客户端
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //获取下载文件路径 String realPath = this.getServletContext().getRealPath("/11.jpg"); //这里是路径 System.out.println("获取的要下载文件的路径是:"+realPath); //下载的文件名是什么 String fileName = realPath.substring(realPath.lastIndexOf("\\")+1); //设置想办法让浏览器能够支持(Content-disposition)下载我们需要的东西,中文文件URLEncoder.encode编码,要不然会乱码 resp.setHeader("Content-disposition","attachment;filename="+ URLEncoder.encode(fileName,"utf-8")); //获取下载文件的输入流 FileInputStream in = new FileInputStream(realPath); //创建缓冲区 int len = 0; byte[] buffer = new byte[1024]; //获取OutputStream对象 ServletOutputStream out = resp.getOutputStream(); //将FileOutStream流写入到Buffer缓冲区 while((len=in.read(buffer))>0){ out.write(buffer,0,len); } in.close(); out.close(); //使用OutputStream将缓冲区中的数据输出到客户端 }
Response重定向
B一个web资源收到客户端A请求后,B他会通知客户端去访问另一个web资源C,这个过程叫重定向
常见场景:
用户登录:这个方法
public void sendRedirect(String location) throws IOException; public class RedirectServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //处理请求,把前端的账号密码打印到了后台 String username = resp.getParameter("username"); String password = resp.getParameter("password"); //重定向 resp.sendRedirect("/r/success.jsp"); //提交之后跳转到这里,重定向的时候一定注意路径问题,要不然404 } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } } jsp代码 <%--这里提交的路径需要寻找项目的路径--%> <%--${pageContext.request.contextPath}代表当前项目--%> <form action="${pageContext.request.contextPath}/login" method="get"> 用户名:<input type="text" name="username"> 密码:<input type="password" name="password"> <input type="submit"> </form> wen.xml代码 <servlet> <servlet-name>re</servlet-name> <servlet-class>com.qiqi.servlet.RedirectServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>re</servlet-name> <url-pattern>/login</url-pattern> </servlet-mapping>
HttpServletRequest(请求)应用
HttpServletRequest代表请求,用户通过Http协议访问服务器 Http请求中的所有信息全会被封装到HttpServletRequest中,通过这个HttpServletRequest方法,获得客户端的所有信息
req.getPart() //可以返回字符串和字符串数组 登录实现:获取参数请求转发 public class LoginServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("utf-8"); //处理后台乱码问题 resp.setCharacterEncoding("utf-8"); String username = req.getParameter("username"); String password = req.getParameter("password"); String[] hobbys = req.getParameterValues("hobbys"); System.out.println("===================================="); System.out.println("username:"+username); System.out.println("password:"+password); System.out.println(Arrays.toString(hobbys)); System.out.println("===================================="); //通过请求转发 resp.setCharacterEncoding("utf-8"); req.getRequestDispatcher("/succeess.jsp").forward(req,resp); } jsp文件 <body> <h1>登录:</h1> <div style="text-align: center"> <%--这里表单的意思是,会以post方式提交表单,提交到login请求--%> <form action="${pageContext.request.contextPath}/login" method="post"> 用户名:<input type="text" name="username"><br> 密码:<input type="password" name="password"><br> 爱好: <input type="checkbox" name="hobbys" value="女孩">女陔 <input type="checkbox" name="hobbys" value="唱歌">唱歌 <input type="checkbox" name="hobbys" value="电影">电影 <input type="checkbox" name="hobbys" value="代码">代码 <br> <input type="submit"> </form> </div> </body> </html> web.xml文件 <servlet> <servlet-name>LoginServlet</servlet-name> <servlet-class>com.kuang.servlet.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/logir</url-pattern> </servlet-mapping>
Cookie Session
会话:用户打开一个浏览器,点击了很多超链接,访问了多个web资源,关闭浏览器,这个过程称之为会话
有状态会话:客户端曾经访问过服务器,下次来服务器记住了,曾经来过称之为有状态会话
怎么证明客户端来过服务端?
1,服务端给客户端一个新建,客户端下次访问带上新建就可以;cookie
2,服务器等级你来过了下次你来的时候我来匹配;seesion
保存会话的两种技术(Cookie Session)
cookie:
客户端技术(响应,请求)
session:
服务器技术,利用这个技术可以保存用户的会话信息,我们可以把信息或数据放在session中
Cookie[] cookies1 = req.getCookies(); //获得Cookie cookies1.getName(); //获得Cookie中得key cookies1.getValue(); //获得Cookie中得Vlaue new Cookie("lastLoginTime",System.currentTimeMillis()+"");//新建一个Cookie cookies1.setMaxAge(24*60*60); //设置Cookie有效期 resp.addCookie(cookies1); //响应给客户端一个Cookie
Cookie:一般保存在本地的用户目录下的appdata;
一个网站得Cookie存在上限
一个Cookie只能保存一个信息
一个web可以给浏览器发送多个Cookie,浏览器最多300个,最多存放20个Cookie
Cookie大小校址4kb
删除Cookie(不设置有效期,关闭浏览器自动失效;设置有效期时间为0 setMaxAge(0))
Cookie cookie = new Cookie("name","琪琪"); //编码 out.write(URLDecoder.decode(cookie.getValue(),"utf-8")); //解码