Web开发模式(MVC设计模式)
1.MVC:(Model-View-Controller)操作流程
显示层View:主要负责接收Servlet传递的内容,并调用JavaBean把内容显示给用户。
控制层Controller:负责所有的用户请求参数,判断请求参数是否合法,根据请求方式调用JavaBean进行处理,把结果返给显示层进行显示。
模型层Model:完成一个独立的业务操作组件。一般以JavaBean或者EJB(分布式组件技术)来定义的。
最关键的是RequestDispatcher接口:因为内容是通过该接口保存到JSP页面技能型显示的。
page、request、session、application
在MCV设计模式中,所有的属性传递以request方式(因为:保存范围越大占用的内存越多)进行传递,可以提升代码的操作性能。
简洁、清晰的JSP页面应包含的内容: 在JSP页面中唯一允许导入的包是java.util。
1.接收属性:接收来至Servlet传递过来的属性。
2.判断语句:判断传递到JSP中的属性是否存在。
3.输出语句:使用迭代输出或者JavaBean输出。
2.过滤器Filter
实现过滤器功能:实现javax.servlet.Filter接口
应用一:编码过滤
在每个JSP页面或者Servlet中,设置字符编码格式request.setCharacterEncoding("UTF-8");可使用Filter进行设置
import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class EncodingFilter implements Filter { private String charSet;//字符编码 @Override public void destroy() { System.out.println("过滤器已销毁..."); } @Override public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {// 执行过滤 System.out.println("执行过滤之前:doFilter()"); req.setCharacterEncoding(this.charSet); //统一设置编码 chain.doFilter(req, resp);//请求继续传递 System.out.println("执行过滤之后:doFilter()"); } /** * 在容器启动的时候自动加载,通过getInitParameter()获取配置的初始化参数,只初始化一次。 */ @Override public void init(FilterConfig config) throws ServletException { String initParam = config.getInitParameter("encoding");//获取初始化参数 this.sharSet = initParam ; System.out.println("过滤器初始化,初始化参数是:" + initParam); } }
web.xml中的配置
<filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/jsp/*</url-pattern> </filter-mapping>
<url-pattern>:表示一个过滤器的过滤位置:/*表示对于根目录下的一切操作都进行过滤;若只过滤某一个或者某个目录,则必须明确写出对应的目录.
应用二:登录验证
import java.io.IOException; 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 javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; public class LoginFilter implements Filter { @Override public void destroy() {} /** * session本身属于HTTP协议的范畴,doFilter()定义的是ServletRequest, * 要想获取session,必须进行向下转型:ServletRequest改成HttpServletRequest,才能使用getSession()获取session对象。 */ @Override public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException,ServletException { HttpServletRequest hsp = (HttpServletRequest)req;//向下转型 HttpSession ss = hsp.getSession(); if(ss.getAttribute("userId") != null){ //判断用户是否登录 chain.doFilter(req, resp); }else{ req.getRequestDispatcher("login.jsp").forward(req, resp); //跳转到登录页面 } } @Override public void init(FilterConfig arg0) throws ServletException {} }
3.监听器Filter
应用1:对application的监听
import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; //对上下文状态的监听 public class ServletContextListenner implements ServletContextListener { @Override public void contextDestroyed(ServletContextEvent event) {//上下文销毁触发 System.out.println("容器销毁" + event.getServletContext().getContextPath()); } @Override public void contextInitialized(ServletContextEvent event) {//上下文初始化触发 System.out.println("容器初始化"+ event.getServletContext().getContextPath()); } }
web.xml配置
<listener> <listener-class>com.mxzer.common.listener.ServletContextListenner</listener-class> </listener>
所有Servlet程序必须在web.xml进行配置,配饰顺序如下:
1.先配置过滤器:<filter>、<filter-mapping>
2.再配置监听器:<listener>
3.最后配置Servlet:<servlet> 、<servlet-mapping>
应用2:对Servlet上下文属性的监听,要实现ServletContextAttributeListener接口
应用3:对session的监听
3.1实现HttpSessionListener接口
session销毁的方式:
(1)调用HttpSession中的invalidate()方法
(2)在web.xml中配置session的超时时间
<!-- session 失效时间 单位30分钟 --> <session-config> <session-timeout>30</session-timeout> </session-config>
3.2对session属性的监听,要实现HttpSessionAttributeListener接口,需要在web.xml配置
方式二:使用HttpSessionBindingListener接口
/** * 使用HttpSessionBindingListener * session属性监听:不需要在web.xml中配置 * */ public class ServletContextListenner implements HttpSessionBindingListener { private String loginName; //登录名 public ServletContextListenner(String loginName) { this.loginName = loginName; } public String getLoginName() { return loginName; } public void setLoginName(String loginName) { this.loginName = loginName; } @Override public void valueBound(HttpSessionBindingEvent event) { System.out.println("在session中保存登录对象" + this.getLoginName()+"session ID:"+event.getSession().getId()); } @Override public void valueUnbound(HttpSessionBindingEvent event) { System.out.println("在session中移除登录对象" + this.getLoginName()+"session ID:"+event.getSession().getId()); } }
3.4对request监听
请求状态的监听:实现ServletRequestListenner接口
System.out.println("request请求初始化" +"http://"+ event.getServletRequest().getRomoteAddr());
System.out.println("request请求初始化" +"http://"+ event.getServletContext().getContextPath());
属性的监听:实现ServletRequestAttributeListener
System.out.println(event.getNmae() + event.getValue());