模板网站也需要服务器吗,手机网站 布局,西安seo顾问 顺时网络,网站建设服务开发13 Cookie和Session
http协议是一个无状态的协议#xff0c;你每一个跳转到下一个页面的时候都是需要先登录才能使用#xff0c;这样就很麻烦比如淘宝#xff0c;没有cookie和session的话#xff0c;用户在首页已经登录上去了#xff0c;但是需要再次登录才能选择商品你每一个跳转到下一个页面的时候都是需要先登录才能使用这样就很麻烦比如淘宝没有cookie和session的话用户在首页已经登录上去了但是需要再次登录才能选择商品需要再次登录才能放到购物车需要再次登录才能然后购买这样用户的体验是相当差的。
13.1 cookie
是什么 浏览器保存的内容通常cookie是在浏览器中保存的每一次访问服务器的时候浏览器会自动的把cookie带到下一个页面的 如果想要使用cookie要保证我们的浏览器是开启cookie所以说有一定的弊端如果浏览器没有开启cookie就不能再使用cookie了 cookie的大小是有限制的通常是4096byte cookie的保存是以键值对的形式存在的
常用方法
//1.cookie的构造方法目的是实例化出来cookie对象
Cookie(String name,String value)
//2.设置cookie的方法
setValue(String value) //修改cookie的值
setMaxAge(int time) //设置cookie的有效时间
setPath(String path) //设置当前cookie的有效路径
//3.要将cookie发送到浏览器
response.addCookie(Cookie cookie);servlet实例一
package com.by.servlet;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class SetCookieServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}protected void doGet(HttpServletRequest request,HttpServletResponse response) throws Exception {/*** 1.创建cookie对象* 将键java2311 值sb 存到cookie对象中*/Cookie cookie new Cookie(msg, sb);/*** 2.设置有效时间* 正数表示当前cookie的有效时间* 负数表示当前浏览器打开的时候存在关闭的时候没了* 0销毁当前的cookie*/cookie.setMaxAge(60*60*24);//设 置了有效期是个正数//3.把cookie发送到浏览器response.addCookie(cookie);}
}servletservlet-namesetCookie/servlet-nameservlet-classcom.by.servlet.SetCookieServlet/servlet-class/servletservlet-mappingservlet-namesetCookie/servlet-nameurl-pattern/setCookie/url-pattern/servlet-mappingservlet实例二
package com.by.servlet;import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class GetCookieServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) {doGet(request, response);}protected void doGet(HttpServletRequest request, HttpServletResponse response) {//获取浏览器中cookie返回值是一个数组Cookie[] cookies request.getCookies();for (Cookie cookie : cookies) {System.out.println();System.out.println(cookie.getName());//获取键System.out.println(cookie.getValue());//获取值}}
}servletservlet-namegetCookie/servlet-nameservlet-classcom.by.servlet.GetCookieServlet/servlet-class/servletservlet-mappingservlet-namegetCookie/servlet-nameurl-pattern/getCookie/url-pattern/servlet-mapping实例三
WebServlet(/destroyCookie)
public class DestroyCookieServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}protected void doGet(HttpServletRequest request, HttpServletResponse response) {//退出登录Cookie[] cookies request.getCookies();for (Cookie cookie : cookies) {if (cookie.getName().equals(msg)){cookie.setMaxAge(0);//销毁cookie//重新发送给浏览器response.addCookie(cookie);}}}
}servletservlet-namedestroyCookie/servlet-nameservlet-classcom.by.servlet.DestroyCookieServlet/servlet-class/servletservlet-mappingservlet-namedestroyCookie/servlet-nameurl-pattern/destroyCookie/url-pattern/servlet-mapping13.2 session
为什么使用session
cookie保存数据类型是单一的只能保存字符串类型的数据cookie的大小由限制
是什么 保存服务器中每一个session在我们当前的服务器会有一个标识号 使用session的时候一般要开启cookie如果浏览器没有开启cookie功能我们可以通过html的url传参完后session的使用 没有大小的限制 信息的保存也是以键值对的形式存在的
实例一
package com.by.servlet;import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.Date;public class SetSessionServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response){doGet(request, response);}protected void doGet(HttpServletRequest request, HttpServletResponse response) {//1.获取session对象HttpSession session request.getSession();System.out.println(session);//获取的是JSESSIONID 服务器唯一的标识System.out.println(session.getId());//给session设置一个时间有效果的,里面放的是秒session.setMaxInactiveInterval(60*60*24);User user new User();user.setUsername(张5丰);user.setBirthday(new Date());user.setSex(1);session.setAttribute(user,user);}
}servletservlet-namesetSession/servlet-nameservlet-classcom.by.servlet.SetSessionServlet/servlet-class/servletservlet-mappingservlet-namesetSession/servlet-nameurl-pattern/setSession/url-pattern/servlet-mapping实例二
package com.by.servlet;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 javax.servlet.http.HttpSession;
import java.io.IOException;public class GetSessionServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response){doGet(request, response);}protected void doGet(HttpServletRequest request, HttpServletResponse response) {//1.获取Session对象//第一次创建session的时候默认为true//false的话这个session使用的是已经创建好的session对象HttpSession session request.getSession(false);//2.获取session通过键取值Object user session.getAttribute(user);System.out.println(user);}
}servletservlet-namegetSession/servlet-nameservlet-classcom.by.servlet.GetSessionServlet/servlet-class/servletservlet-mappingservlet-namegetSession/servlet-nameurl-pattern/getSession/url-pattern/servlet-mapping实例三
package com.by.servlet;import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;public class DestroySessionServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) {doGet(request, response);}protected void doGet(HttpServletRequest request, HttpServletResponse response) {//1.获取session对象HttpSession session request.getSession(false);//销毁当前的sessionsession.invalidate();}
}servletservlet-namedestroySession/servlet-nameservlet-classcom.by.servlet.DestroySessionServlet/servlet-class/servletservlet-mappingservlet-namedestroySession/servlet-nameurl-pattern/destroySession/url-pattern/servlet-mapping14 过滤器和监听器
14.1 过滤器
什么是过滤器
当浏览器向服务器发送请求的时候过滤器可以将请求拦截下来完成一些特殊的功能比如编码设置、权限校验、日志记录等。
过滤器执行流程 Filter实例
package com.by.servlet;import javax.servlet.*;
import java.io.IOException;public class FilterDemo implements Filter {Overridepublic void init(FilterConfig filterConfig) throws ServletException {}//真正执行过滤业务的方法Overridepublic void doFilter(ServletRequest request, ServletResponse response,FilterChain filterChain) throws ServletException, IOException {//获取前端传送过来的数据request.setCharacterEncoding(utf-8);//设置请求的编码格式response.setContentType(text/html;charsetutf-8); //设置相应的编码格式System.out.println(请求进来经过过滤器...);//一个web路径可以配置多个过滤器这多个过滤器就被称为过滤器链filterChain.doFilter(request,response);System.out.println(相应返回经过过滤器...);}Overridepublic void destroy() {}
}使用过滤器需要注意的事项
1.过滤器必须实现Filter接口。
2.过滤器拦截的请求执行完毕之后必须要放行否则我们的请求就不会被执行。 filterChain.doFilter(request,response); //过滤器放行3.我们可以使用WebFilter来配置过滤器要拦截的资源当然我们也可以通过xml的方式配置过滤器。 filterfilter-namefilter/filter-namefilter-classcom.by.servlet.FilterDemo/filter-class/filterfilter-mappingfilter-namefilter/filter-nameurl-pattern/*/url-pattern/filter-mappingFilter的拦截路径的配置
1.拦截具体的资源路径:/index.jsp只有访问index.jsp的时候才会被拦截
2.目录拦截/user/*访问/user下的所有资源都会被拦截
3.后缀名拦截:*.jsp 访问后缀名为jsp的资源都会被拦截
4.拦截所有/* 访问所有的资源都会被拦截
测试
1.创建servlet
package com.by.servlet;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class FilterTestServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//设置字符编码//request.setCharacterEncoding(utf-8);String username request.getParameter(username);String password request.getParameter(password);System.out.println(username: usernamepasswordpassword);//设置字符编码//response.setContentType(text/html;charsetutf-8);response.getWriter().write(username: usernamepasswordpassword);}
}2.配置servlet servletservlet-namefilterTest/servlet-nameservlet-classcom.by.servlet.FilterTestServlet/servlet-class/servletservlet-mappingservlet-namefilterTest/servlet-nameurl-pattern/filterTest/url-pattern/servlet-mapping3.创建filter_test.jsp
% page contentTypetext/html;charsetUTF-8 languagejava %
html
headtitleTitle/title
/head
body
form actionfilterTest methodpostinput typetext nameusername/brinput typetext namepassword/brinput typesubmit value提交
/form
/body
/html14.2 监听器
是什么
监听器可以监听就是在applicationsessionrequest三个对象创建、销毁或者往其中添加修改删除属性时自动执行代码的功能组件。
Listener分类Javaweb提供了8个监听器接口 listen实例
package com.by.servlet;import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;public class MyListener implements ServletContextListener {//监听Servlet上下文对象创建的方法Overridepublic void contextInitialized(ServletContextEvent servletContextEvent) {System.out.println(tomcat启动(create servletContext));}//监听Servlet上下文对象销毁的方法Overridepublic void contextDestroyed(ServletContextEvent servletContextEvent) {System.out.println(tomcat关闭(destroyed servletContext));}
}!--配置监听器--listenerlistener-classcom.by.listen.MyListener/listener-class/listener15 web三层架构 分层的目的是为了解耦。解耦就是为了降低代码的耦合度。方便项目后期的维护和升级。 web层 com.by.web/servlet/controllerservlet包 service 层 com.by.serviceService接口包 com.by.service.implService接口实现类 dao 持久层 com.by.daoDao接口包 com.by.dao.impl Dao接口实现类