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后面的代码。
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。
多个过滤器执行顺序:
web.xml文件配置的, 根据filter的<filter-mapping>位置决定, 谁<filter-mapping>在前,谁先执行
在web3.0 提供注解的方式: @WebFilter("/*")
执行顺序,根据 Filter位置决定, 谁在前,谁先执行
可以把页面放到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()); }