JavaWeb-MVC、过滤器

打印 上一主题 下一主题

主题 910|帖子 910|积分 2730

一、MVC架构图


Model

  • 业务处理:业务逻辑(Service)
  • 数据持久层:CRUD(Dao)
View

  • 展示数据
  • 提供连接发起Servlet请求(a,form,img....)
Controller(Servlet)

  • 接收用户的请求:(req:请求参数,Session信息)
  • 交给业务层处理对应的代码
  • 控制视图的跳转
    比如一个登录流程
  1. 登录--->接收用户的登录请求--->Servlet处理用户的请求(获取用户登录的参数,username,password)--->交
  2. 给业务员层处理登录业务(判断用户名密码是否正确)--->Dao层查询用户名和密码是否正确-->数据库
复制代码
二、过滤器(Filter重点)

Filter:过滤器,用来过滤网站的数据;

  • 处理中文乱码
  • 登录验证.....

1.Filter开发步骤

(1)导入Maven依赖
  1. <dependency>
  2.           <groupId>javax.servlet</groupId>
  3.           <artifactId>javax.servlet-api</artifactId>
  4.           <version>3.1.0</version>
  5.          
  6.          
  7.       </dependency>
  8.       
  9.       <dependency>
  10.           <groupId>javax.servlet.jsp</groupId>
  11.           <artifactId>javax.servlet.jsp-api</artifactId>
  12.           <version>2.3.3</version>
  13.       </dependency>
  14.       
  15.       <dependency>
  16.           <groupId>taglibs</groupId>
  17.           <artifactId>standard</artifactId>
  18.           <version>1.1.2</version>
  19.       </dependency>
  20.       
  21.       <dependency>
  22.           <groupId>javax.servlet.jsp.jstl</groupId>
  23.           <artifactId>jstl</artifactId>
  24.           <version>1.2</version>
  25.       </dependency>
复制代码
(2)编写过滤器

  * 实现Filter接口  * 重写方法  ~~~java  package com.tang.filter;import javax.servlet.*;
import java.io.IOException;
public class CharacterEncodingFilter implements Filter {
//初始化:web服务器启动,就已经初始化了,随时等待过滤器对象出现
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("characterEncoding初始化");
}
/*
* chain 链
* 1.过滤其中所有代码,在过滤特定请求
*   (特定请求:比如在Servlet中会在web.xml中进行注册,同理过滤器也一样需要注册和添加映射)的时候都会执行
* 2.必须要让过滤器继续通行
*    chain.doFilter(request,response);*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding("utf-16");//写utf-8得写setContentType为text/html,否则还会乱码因此我直接写utf-16
response.setCharacterEncoding("utf-16");
response.setContentType("text/html;charset=UTF-8");
  1.     System.out.println("setCharacterEncoding执行前。。。");
  2.     chain.doFilter(request,response);//对过滤器起一个放行的作用,如果不写程序到这里就被拦截停止
  3.     System.out.println("setCharacterEncoding执行后。。。");
  4. }
  5. //销毁:web服务器关闭的时候,过滤器会销毁
  6. public void destroy() {
  7.     System.out.println("characterEncoding销毁");
  8. }
复制代码
}
  1. <h4>(3)在web.xml中配置filter
  2. ~~~xml
  3. <servlet>
  4.       <servlet-name>showservlet</servlet-name>
  5.       <servlet-class>com.tang.servlet.ShowServlet</servlet-class>
  6.   </servlet>
  7.   <servlet-mapping>
  8.       <servlet-name>showservlet</servlet-name>
  9.       <url-pattern>/servlet/show</url-pattern>
  10.   </servlet-mapping>
  11.   <servlet-mapping>
  12.       <servlet-name>showservlet</servlet-name>
  13.       
  14.       <url-pattern>/show</url-pattern>
  15.   </servlet-mapping>
  16.   <filter>
  17.       <filter-name>CharacterEncodingFilter</filter-name>
  18.       <filter-class>com.tang.filter.CharacterEncodingFilter</filter-class>
  19.   </filter>
  20.   <filter-mapping>
  21.       <filter-name>CharacterEncodingFilter</filter-name>
  22.       
  23.       <url-pattern>/servlet/*</url-pattern>
  24.   </filter-mapping>
复制代码
ShowServlet代码如下
  1. package com.tang.servlet;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.http.HttpServlet;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. import java.io.IOException;
  7. public class ShowServlet extends HttpServlet {
  8.     @Override
  9.     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  10.         //resp.setCharacterEncoding("UTF-16");
  11.         resp.getWriter().write("唐三是挂,谁惹谁挂");
  12.     }
  13.     @Override
  14.     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  15.         doGet(req, resp);
  16.     }
  17. }
复制代码
运行结果图
同一个请求,以servlet开头的访问会被过滤,另一个去访问则不会被过滤,结果如下


2.常见应用

(1)用户登录之后才能进入主页!用户注销后就不能进入主页了,用过滤器实现
LoginServlet代码
  1. package com.tang.servlet;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.http.HttpServlet;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. import java.io.IOException;
  7. public class LoginServlet extends HttpServlet {
  8.     @Override
  9.     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  10.        //获取前端请求的参数
  11.         System.out.println("进入了登录");
  12.         //String username = req.getParameter("username");
  13.         if(req.getParameter("username").equals("admin")){//登录成功
  14.             System.out.println("登录成功");
  15.             //USER_SESSION为一个常量,通常自己新建util包,并放在新建constant的类中
  16.             req.getSession().setAttribute("USER_SESSION",req.getSession().getId());
  17.             resp.sendRedirect("/Filter_war/sys/success.jsp");
  18.         }else {
  19.             resp.sendRedirect("/Filter_war/error.jsp");
  20.         }
  21.     }
  22.     @Override
  23.     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  24.         doGet(req, resp);
  25.     }
  26. }
复制代码
login.jsp代码
  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4.     <title>Title</title>
  5. </head>
  6. <body>
  7. <h1>登录</h1>
  8. <%--这里如果用post方式提交会出现在前端页面输入信息,但是却得不到前端请求的参数值--%>
  9. <form action="/Filter_war/servlet/login" method="get">
  10.     <input type="text" name="username">
  11.     <input type="submit">
  12. </form>
  13. </body>
  14. </html>
复制代码
LogoutServlet代码
  1. package com.tang.servlet;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.http.HttpServlet;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. import java.io.IOException;
  7. public class LogoutServlet extends HttpServlet {
  8.     @Override
  9.     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  10.         String user_session = (String) req.getSession().getAttribute("USER_SESSION");
  11.         if(user_session != null){//说明用户处于登录状态,因为只有登录状态USER_SESSION不为空也即user_session不为空
  12.             req.getSession().removeAttribute("USER_SESSION");//将该登录状态的用户移除
  13.             resp.sendRedirect("/Filter_war/login.jsp");//注销之后进入登录界面
  14.         }else{
  15.             resp.sendRedirect("/Filter_war/login.jsp");//注销为空也回到该页面
  16.         }
  17.     }
  18.     @Override
  19.     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  20.         doGet(req, resp);
  21.     }
  22. }
复制代码
success.jsp主界面代码
  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4.     <title>Title</title>
  5. </head>
  6. <body>
  7. <%
  8.     Object user_session = request.getSession().getAttribute("USER_SESSION");
  9.     if(user_session == null){//用户没有登录就不能进如主界面
  10.         response.sendRedirect("/Filter_war/login.jsp");
  11.     }
  12. %>
  13. <h1>主页</h1>
  14. <p><a target="_blank" href="https://www.cnblogs.com/Filter_war/servlet/logout">注销</a></p>
  15. </body>
  16. </html>
复制代码
error.jsp代码
  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4.     <title>Title</title>
  5. </head>
  6. <body>
  7. <h1>错误</h1>
  8. 用户名或者密码错误
  9. <a target="_blank" href="https://www.cnblogs.com/Filter_war/login.jsp">返回登录界面</a>
  10. </body>
  11. </html>
复制代码
web.xm代码如下
  1. <servlet>
  2.         <servlet-name>LoginServlet</servlet-name>
  3.         <servlet-class>com.tang.servlet.LoginServlet</servlet-class>
  4.     </servlet>
  5.     <servlet-mapping>
  6.         <servlet-name>LoginServlet</servlet-name>
  7.         <url-pattern>/servlet/login</url-pattern>
  8.     </servlet-mapping>
  9.     <servlet>
  10.         <servlet-name>logoutServlet</servlet-name>
  11.         <servlet-class>com.tang.servlet.LogoutServlet</servlet-class>
  12.     </servlet>
  13.     <servlet-mapping>
  14.         <servlet-name>logoutServlet</servlet-name>
  15.         <url-pattern>/servlet/logout</url-pattern>
  16.     </servlet-mapping>
复制代码
运行结果图


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

玛卡巴卡的卡巴卡玛

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表