1. MVC三层架构
什么是MVC:
Model模型:
-
实体类和数据库中对应的字段
-
view视图:jsp页面
-
Controller:servlet负责跳转页面
早些年:用户直接访问控制层,控制层可以直接操作数据库。
servlet——>CRUD——>数据库
弊端:程序十分臃肿,不利于维护。servlet的代码中:处理请求,响应,视图跳转,处理jdbc,处理业务代码,处理逻辑代码。(十分复杂)
架构:没有什么是加一层是解决不了的。
现在:把业务层从控制器中提取:
扫描二维码关注公众号,回复:
12677225 查看本文章

Model:
- 业务处理:业务逻辑(service)
- 数据持久层:CRUD(Dao)
View:
- 展示数据
- 提供连接发起servlet请求(a, form, img...)
Controller(Servlet)
- 接收用户的请求:(req:请求参数, session信息)
- 交给业务层处理对应的代码
- 控制视图的跳转:
登陆--->接受用户的登陆请求--->处理用户的请求(获取用户的登陆参数:username,password)--->交给业务层处理登陆业务(判断用户名密码是否正确)
--->Dao层查询用户名和密码是否正确--->数据库
如果查询成功,逆向往回。
2. 过滤器(重点)
Filter:过滤器,用来过滤网站的数据。它和servlet一模一样,只不过servlet实现的是servlet接口,filter实现的filter接口。shiro也是用filter实现的。
- 处理中文乱码
- 登录验证
开发步骤:
- 导入依赖:
<dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>javax.servlet.jsp-api</artifactId> <version>2.3.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>javax.servlet.jsp-api</artifactId> <version>2.3.1</version> <scope>provided</scope> </dependency> <!--JSTL表达式的依赖 --> <!-- https://mvnrepository.com/artifact/javax.servlet.jsp.jstl/jstl-api --> <dependency> <groupId>javax.servlet.jsp.jstl</groupId> <artifactId>jstl-api</artifactId> <version>1.2</version> </dependency> <!--standard标签库 --> <!-- https://mvnrepository.com/artifact/taglibs/standard --> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>1.1.2</version> </dependency> <!--连接数据库 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> </dependencies>
-
导包别选错
-
编写过滤器
public class CharacterEncodingFilter implements Filter{ //初始化:web服务器启动,他就已经初始化了。他要随时等待过滤对象出现。 @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override 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来放行对象,不写的话过滤器到这里就停住了。 //有多个过滤器,形成一个链 /* 1. 过滤器中的所有代码,在过滤特定请求的时候都会执行。 2. 必须要让过滤器继续通行 chain.doFilter(request,response);固定的代码 */ chain.doFilter(request,response);// 让我们的请求继续走,没有的话程序停止。 System.out.println("CharacterEncodingFilter执行后"); } //销毁:web服务器关闭的时候,过滤器会销毁。 @Override public void destroy() { System.out.println("CharacterEncodingFilter销毁"); } }
3. 监听器
监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行。
实现一个监听器的接口:(有很多种)
- 编写一个监听器:实现监听器的接口
- web.xml中注册监听器
session销毁:
4. 应用场景
监听器:主要用在GUI
过滤器:用户登陆后才能进入主页,注销后就不能进去主页。
访问顺序:
- 用户登录之后,向session中放入用户数据
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取前端请求的参数
String username = req.getParameter("username");//req.getParameter(Constant.USER_SESSION);
if(username.equals("admin")){
//登陆成功,会把用户信息放到session里,所以getsession
//name一般不用"USER_SESSION",新建util包,建constant类
req.getSession().setAttribute("USER_SESSION",req.getSession().getId());
//重定向
resp.sendRedirect("/sys/success.jsp");
}else{
//登陆失败
resp.sendRedirect("/error.jsp");
}
}
- 进入主页的时候,要判断用户是否已经登录(在过滤器中实现)
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//父子关系,需要强转
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
Object userSession = req.getSession().getAttribute("USER_SESSION");
if(userSession==null){
resp.sendRedirect("/error.jsp");
}
chain.doFilter(request, response);
}
- 注销功能,删除session信息
public class LogoutServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//移除session
Object user_session = req.getSession().getAttribute("USER_SESSION");
//user_session!=null意味着用户登陆着
if(user_session!=null){
//移除(用session)
req.getSession().removeAttribute("USER_SESSION");
//重定向到登陆页面
resp.sendRedirect("/login.jsp");
}else{
resp.sendRedirect("/login.jsp");
}
}