文章目录
JavaBean
- 实体类
JavaBean由特定的写法:- 必须要有一个无参构造
- 属性必须私有化
- 必须有对应的get/set方法
- 一般用来和数据库的字段做映射 ORM:对象关系映射
- 表 —> 类
- 字段 --> 属性
- 行记录 --> 对象
MVC三层架构
什么是MVC:model view controller 模型、视图、控制器
1、早些年
以上图片解读:用户直接访问控制层,控制层就可以直接操作数据库
1、servlet – CRUD – 数据库
2、弊端:程序十分臃肿,不利于维护 ;servlet代码中:处理请求、响应、处理业务代码、处理逻辑代码
3、架构:没有什么是加一层解决不了的
2、MVC三层架构
-
model
1、业务处理:业务逻辑(service)
2、数据持久层:CRUD(dao) -
view
1、展示数据
2、提供链接发起servlet请求 -
controller(servlet)
1、接收用户的请求:(req:请求参数、session信息)
2、交给业务层处理对应的代码
3、控制视图的跳转
Filter(过滤器,重点)
用来过滤网站的数据
1、处理中文乱码
2、登陆处理
-
Filter开发步骤
1、导包
2、编写过滤器(实现接口,包不要导错)import javax.servlet.*; public class CharacterEncodingFilter implements Filter
public class CharacterEncodingFilter implements Filter { // web服务器启动,就已经初始化了,随时等待过滤对象的出现 public void init(FilterConfig filterConfig) throws ServletException { System.out.println("CharacterEncodingFilter初始化"); } /* * 1. 过滤中的所有代码,在过滤特定请求的时候都会执行 * 2. 必须要让过滤器继续通行 * chain.doFilter(request,response); * */ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=UTF-8"); System.out.println("CharacterEncodingFilter执行前"); // 放行的作用,让我们的请求继续走; 如果没有,程序到这就停了 chain.doFilter(request,response); System.out.println("CharacterEncodingFilter执行后"); } // web服务器关闭的时候,销毁 public void destroy() { System.out.println("CharacterEncodingFilter销毁"); } }
3、在web.xml中配置
<filter> <filter-name>characterEncoding</filter-name> <filter-class>cn.fsh.pojo.CharacterEncodingFilter</filter-class> </filter> <filter-mapping> <filter-name>characterEncoding</filter-name> <!--只要是 /servlet 的任何请求,都会经过这个过滤器--> <url-pattern>/servlet/*</url-pattern> </filter-mapping>
-
filter是实现权限拦截
用户登陆转换才能进入主页!用户注销后就不能进入主页了
1、用户登陆之后,向session对象中存入一个辨识用户已经登陆的数据HttpSession session = req.getSession(); session.setAttribute("USER_SESSION",req.getSession().getId());
2、如果想要直接在浏览器url中输入成功界面的地址,需要经过过滤器进行判断session中是否存在哪个标识用户已经登陆的值
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest)request; HttpServletResponse resp = (HttpServletResponse)response; // 设置编码 req.setCharacterEncoding("utf-8"); resp.setCharacterEncoding("utf-8"); resp.setContentType("text/html;charset=UTF-8"); // 判断session中的关于登陆的值是否存在 if(req.getSession().getAttribute("USER_SESSION") == null) { // 返回登陆界面 resp.sendRedirect("/index.jsp"); } chain.doFilter(req,resp); }
3、注销登录,就是移除session中的值
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 消除session中的值 Object user_session = req.getSession().getAttribute("USER_SESSION"); if (user_session == null) { // 值为空,说明用户注销了 }else { // 不为空,移除 req.getSession().removeAttribute("USER_SESSION"); // 重定向到登陆界面 resp.sendRedirect("/index.jsp"); } }
Listener(监听器)
-
1、编写监听器
// 统计在线人数,统计session public class OnlineCountListeners implements HttpSessionListener { // 创建session监听: // 一旦创建session就会触发一次这个事件 public void sessionCreated(HttpSessionEvent se) { ServletContext context = se.getSession().getServletContext(); Integer onlineCount = (Integer) context.getAttribute("onlineCount"); if (onlineCount == null) { onlineCount = new Integer(1); }else { int count = onlineCount.intValue(); onlineCount = new Integer(count+1); } context.setAttribute("onlineCount", onlineCount); } public void sessionDestroyed(HttpSessionEvent se) { ServletContext context = se.getSession().getServletContext(); Integer onlineCount = (Integer) context.getAttribute("onlineCount"); if (onlineCount == null) { onlineCount = new Integer(0); }else { int count = onlineCount.intValue(); onlineCount = new Integer(count-1); } context.setAttribute("onlineCount", onlineCount); } }
-
2、在web.xml中注册监听器
<listener> <listener-class>cn.fsh.pojo.OnlineCountListeners</listener-class> </listener>