1. MVC1.1 MVC设计模式

java控制器被隐藏了如何打开 java控制器概念_mvc

 

MVC设计模式

MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。

MVC模式最早为Trygve Reenskaug提出,为施乐帕罗奥多研究中心(Xerox PARC)的Smalltalk语言发明的一种软件设计模式。

MVC可对程序的后期维护和扩展提供了方便,并且使程序某些部分的重用提供了方便。而且MVC也使程序简化,更加直观。

控制器Controller:对请求进行处理,负责请求转发;

视图View:界面设计人员进行图形界面设计;

模型Model:程序编写程序应用的功能(实现算法等等)、数据库管理;


注意,MVC不是Java的东西,几乎现在所有B/S结构的软件都采用了MVC设计模式。但是要注意,MVC在B/S结构软件并没有完全实现,例如在我们今后的B/S软件中并不会有事件驱动!

7.2 JavaWeb经典三层框架

我们常说的三层框架是由JavaWeb提出的,也就是说这是JavaWeb独有的!

所谓三层是表述层(WEB层)、业务逻辑层(service),以及数据访问层(dao)。

  • WEB层:包含JSP和Servlet等与WEB相关的内容;
  • 业务层:业务层中不包含JavaWeb API,它只关心业务逻辑;
  • 数据层:封装了对数据库的访问细节;

  注意,在业务层中不能出现JavaWeb API,例如request、response等。也就是说,业务层代码是可重用的,甚至可以应用到非Web环境中。业务层的每个方法可以理解成一个万能,例如转账业务方法。业务层依赖数据层,而Web层依赖业务层!

2. 过滤器(Filter)

2.1过滤器概述

1 什么是过滤器

过滤器JavaWeb三大组件之一,它与Servlet很相似!不它过滤器是用来拦截请求的,而不是处理请求的。

当用户请求某个Servlet时,会先执行部署在这个请求上的Filter,如果Filter“放行”,那么会继承执行用户请求的Servlet;如果Filter不“放行”,那么就不会执行用户请求的Servlet。

其实可以这样理解,当用户请求某个Servlet时,Tomcat会去执行注册在这个请求上的Filter,然后是否“放行”由Filter来决定。可以理解为,Filter来决定是否能调用Servlet!当执行完成Servlet的代码后,还会执行Filter后面的代码。

java控制器被隐藏了如何打开 java控制器概念_servlet_02

 

2 过滤器之hello world

  其实过滤器与Servlet很相似,我们回忆一下如果写的第一个Servlet应用!写一个类,实现Servlet接口!没错,写过滤器就是写一个类,实现Filter接口。

public class HelloFilter implements Filter {
    //过滤器创建之后马上调用
    public void init(FilterConfig filterConfig) throws ServletException {}
    //当访问被拦截资源时,doFilter()方法会被调用!我们先不去管它的参数是什么作用!
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        System.out.println("Hello Filter");
    }
    //过滤器销毁之前调用
    public void destroy() {}
}
 
第二步也与Servlet一样,在web.xml文

件中部署Filter:

<filter>   
     <filter-name>helloFilter</filter-name>     
     <filter-class>cn.itcast.filter.HelloFilter</filter-class> 
</filter> 
<filter-mapping>    
    <filter-name>helloFilter</filter-name>  
    <url-pattern>/index.jsp</url-pattern> 
</filter-mapping>

OK了,现在可以尝试去访问index.jsp页面了,看看是什么效果!

当用户访问index.jsp页面时,会执行HelloFilter的doFilter()方法!在我们的示例中,index.jsp页面是不会被执行的,如果想执行index.jsp页面,那么我们需要放行!

public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        //执行index.jsp之前执行
        System.out.println("filter start...");
        //放行,去执行index.jsp
        chain.doFilter(request, response);
        //在执行index.jsp后执行这一句
        System.out.println("filter end...");
    }

 

  有很多同学总是错误的认为,一个请求在给客户端输出之后就算是结束了,这是不对的!其实很多事情都需要在给客户端响应之后才能完成!

2.2 过滤器详细

1 过滤器的生命周期

我们已经学习过Servlet的生命周期,那么Filter的生命周期也就没有什么难度了!

  • init(FilterConfig):在服务器启动时会创建Filter实例,并且每个类型的Filter只创建一个实例,从此不再创建!在创建完Filter实例后,会马上调用init()方法完成初始化工作,这个方法只会被执行一次;
  • doFilter(ServletRequest req,ServletResponse res,FilterChain chain):这个方法会在用户每次访问“目标资源(<url->pattern>index.jsp</url-pattern>)”时执行,如果需要“放行”,那么需要调用FilterChain的doFilter(ServletRequest,ServletResponse)方法,如果不调用FilterChain的doFilter()方法,那么目标资源将无法执行;
  • destroy():服务器会在创建Filter对象之后,把Filter放到缓存中一直使用,通常不会销毁它。一般会在服务器关闭时销毁Filter对象,在销毁Filter对象之前,服务器会调用Filter对象的destory()方法。

2 FilterConfig

你已经看到了吧,Filter接口中的init()方法的参数类型为FilterConfig类型。它的功能与ServletConfig相似,与web.xml文件中的配置信息对应。下面是FilterConfig的功能介绍:

  • ServletContext getServletContext():获取ServletContext的方法;
  • String getFilterName():获取Filter的配置名称;与<filter-name>元素对应;
  • String getInitParameter(String name):获取Filter的初始化配置,与<init-param>元素对应;
  • Enumeration getInitParameterNames():获取所有初始化参数的名称。

Filter

当用户请求某个Servlet时,会先执行部署在这个请求上的Filter,如果Filter“放行”,那么会继承执行用户请求的Servlet;如果Filter不“放行”,那么就不会执行用户请求的Servlet。

java控制器被隐藏了如何打开 java控制器概念_前端_03

多个过滤器执行顺序:

web.xml文件配置的, 根据filter的<filter-mapping>位置决定, 谁<filter-mapping>在前,谁先执行

在web3.0 提供注解的方式: @WebFilter("/*")

执行顺序,根据 Filter位置决定, 谁在前,谁先执行

java控制器被隐藏了如何打开 java控制器概念_mvc_04

 

java控制器被隐藏了如何打开 java控制器概念_前端_05

 

可以把页面放到WEB-INF目录, 但是图片,css,js不要放到WEB-INF, WEB-INF目录下的资源浏览器无法直接访问, 超链接无法访问, 重定向无法访问, 转发可以访问

8.3java.util.Date 与java.sql.Date的转换

java.util.Date 是java.sql.Date的父类

给?赋值的时候, PreparedStatement#setDate() 需要是java.sql.Date

实体类的日期属性: java.util.Date

java.sql.Date(子) = java.util.Date(父); 报错

需要把java.util.Date转换为java.sql.Date

new java.sql.Date(long 毫秒值)

把java.util.Date转换为毫秒值: getTime()

 public static java.sql.Date changeDate(java.util.Date date){        return new  java.sql.Date(date.getTime());   }