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());

 

posted @ 2017-02-24 10:13  Mxzer.Zhang  阅读(1715)  评论(0编辑  收藏  举报