-
MVC模型
MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式。这种模式用于应用程序的分层开发。
- Model(模型) - 模型代表一个存取数据的对象或 JAVA POJO。它也可以带有逻辑,在数据变化时更新控制器。
- View(视图) - 视图代表模型包含的数据的可视化。
- Controller(控制器) - 控制器作用于模型和视图上。它控制数据流向模型对象,并在数据变化时更新视图。它使视图与模型分离开。
-
实现
创建一个 Student 对象。
StudentView 是一个把学生详细信息输出到控制台的视图类
StudentController 是负责存储数据到 Student 对象中的控制器类,并相应地更新视图 StudentView。 -
过滤器
在Web中的过滤器,对请求进行过滤,通过使用过滤器,可以对请求进行拦截,然后做相应的处理,实现许多特殊功能。
- 身份验证和授权: 检查用户是否已登录,是否有权限访问某些资源。
- 日志记录: 记录请求和响应的相关信息,用于调试和分析。
- 字符编码处理: 对请求和响应进行字符编码的转换。
- 性能监控: 统计请求的处理时间,检测潜在的性能问题。
过滤器的生命周期:
- init(FilterConfig config): 用于进行过滤器的初始化工作,在容器启动时被调用。
- doFilter(ServletRequest request, ServletResponse response, FilterChain chain): 执行过滤操作的核心方法,可以在此方法中对请求和响应进行处理,并将请求传递给下一个过滤器(或Servlet)。
- destroy(): 在容器关闭时被调用,用于执行一些资源释放的操作
过滤器的实现:
import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import java.io.IOException; public class MyFilter implements Filter { //注意是servlet中的Filter接口 @Override public void init(FilterConfig filterConfig) throws ServletException { // 初始化操作,可获取配置信息 } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 在请求处理之前执行的逻辑 System.out.println("Before Request Processing in Filter"); // 执行下一个过滤器(如果有),或者到达Servlet chain.doFilter(request, response);//放行 // 在请求处理之后执行的逻辑 System.out.println("After Request Processing in Filter"); } @Override public void destroy() { // 资源释放操作 } } //通过XML配置过滤器: <filter> <filter-name>MyFilter</filter-name> <filter-class>com.example.MyFilter</filter-class> </filter> <filter-mapping> <filter-name>MyFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
-
监听器
什么是监听器:
是一个实现了特定接口的Java类,用来监听另一个 Java类的方法调用或者属性的改变,当被监听对象发生了上述事件后,监听器某个方法将会立即被执行。
Servlet 中监听器的分类:
- 监听三个域对象的创建和销毁的监听器(三个);
- 监听三个域对象的属性变更(属性添加、移除、替换)的监听器(三个);
- 监听HttpSession中JavaBean的状态改变(钝化、活化、绑定、解除绑定)的监听器(两个);
举例:监听HttpSession域对象的创建和销毁
package com.test.listener; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; public class MyHttpSessionListener implements HttpSessionListener { @Override public void sessionCreated(HttpSessionEvent se) { System.out.println( se.getSession() + "创建了!!"); } @Override public void sessionDestroyed(HttpSessionEvent se) { System.out.println("session销毁了!!"); } } //在web.xml文件中注册监听器: <!--注册针对HttpSession对象进行监听的监听器--> <listener> <listener-class>com.test.listener.MyHttpSessionListener</listener-class> </listener> <!-- 配置HttpSession对象的销毁时机 --> <session-config> <!--配置HttpSession对象的1分钟之后销毁 --> <session-timeout>1</session-timeout> </session-config>
-
用户登录后才能进入主页的案例
思路: 从session中取登录后存到其中的值,能取到说明登陆过,放行到主页面,娶不到则说明没登录过跳转到错误页面。
//创建常量类: package com.test.util; public class Constant { public final static String USER_SESSION="user_session"; //创建过滤器: package com.test.filter; import com.test.util.Constant; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class LoginFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { //ServletRequest HttpServletRequest HttpServletRequest request=(HttpServletRequest) servletRequest; HttpServletResponse response=(HttpServletResponse) servletResponse; if(request.getSession().getAttribute(Constant.USER_SESSION)==null){ response.sendRedirect("/error/login-error.jsp"); } filterChain.doFilter(request,response);//继续走业务逻辑 } @Override public void destroy() { } } //配置web.xml <servlet> <servlet-name>LoginServlet</servlet-name> <servlet-class>com.test.servlet.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/user/*</url-pattern> </servlet-mapping> <filter> <filter-name>LoginFilter</filter-name> <filter-class>com.test.filter.LoginFilter</filter-class> </filter> <filter-mapping> <filter-name>LoginFilter</filter-name> <url-pattern>/user/*</url-pattern> </filter-mapping> //登录页测试 package com.test.servlet; import com.test.util.Constant; 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 LoginServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //获取前端请求的参数 String username=req.getParameter("username"); if(username.equals("admin")){//登录成功 req.getSession().setAttribute(Constant.USER_SESSION,req.getSession().getId()); resp.sendRedirect("/success.jsp"); }else{//登录失败 resp.sendRedirect("/error/login-error.jsp"); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } }