今天分享的是javaweb中的MVC设计模式,如果你还没开始学java,不要紧,只要通过本文的阅读,按照我说的做,就可以创建一个自己的网站,同时还能带你熟悉MVC这种设计模设计;

废话不多说进入正题:

MVC :模型+视图+控制器

很多领域都用到这种设计模式,不仅仅是在web端,而在javaweb中模型对应Bean,视图对应service,控制器对应servlet;

我更愿意把其理解为分层设计模式,从用户开始请求的html/jsp主页面开始,

请求会从主页面发出===》》servlet进行分配任务==》》业务层service==》》数据层(dao)==》》Bean(模型穿插于各个层中,用来传递数据)

如果到这里你还处于迷糊状态不要紧,建站离你只有读完这篇文章的距离;

javaweb中有三大组件:servlet(控制器)、Filter(过滤器)、Listener(监听器)

他们都需要在web.xml中进行配置,具体配置可以百度,很简单;

servlet生命周期:(接口、实现类)

init(ServletConfig sconfig);当开启服务器时,这个方法就会被服务器调用,可以理解为servlet出生了;用来给servlet初始化,基本不用;

service(ServletRequest req,ServletResponse res);每个请求都要经过这个方法的处理分配;后期演化出doGet()doPost()等,最后还是由      service来调用这些演化来的方法,万变不离其中;(我会提供一个BaseServlet类来给学习者建站)

destroy();当服务器即将关闭时,这个方法会被服务器调用,用来做一些收尾工作,但是我们一般不会在这里写代码,所以基本不用;

Filter生命周期:(接口)

方法基本同servlet只是用doFilter(ServletRequest request,ServletResponse response,FilterChain chain);替换了service方法;

过滤器作用:可以过滤请求,当过滤器加到用户请求的页面或者servlet上时,请求就会先到过滤器,过滤器只有调用了FilterChain中的doFilter(request,response);请求才会到达所要请求的资源上,也就是说过滤器可以拦截请求;注意跟servlet一样每次请求都会调用doFilter方法;当然过滤器不光能做拦截,还可以用来进行对全站的配置,比如全站编码问题只要是全站设置就要想到用它因为servlet做不到;过滤器还可以做很多事,比如ip统计,页面静态化,粗粒度权限过滤等,其实都体现在对用户发送来的数据、请求头的特殊处理,或者是服务器响应给客户端数据、响应头的特殊处理,一旦需要这种操作,就可以考虑使用过滤器;

Listener生命周期:(接口)

以ServletContextListener举例:contextInitialized(ServletContextEvent event);contextDestroyed(ServletContextEvent event);

这两个方法前一个用来给ServletContext域的创建监听,后一个是用来给ServletContext销毁时监听;其它监听器都是这个原理;

八大监听器接口,六个是对Servlet中的三大域对象进行监听已经与对象属性的监听,其中对ServletContext域进行监听的最有用,因为ServletContext是由服务器创建的,可以用来给项目来做初始化,event.getServletContext()是一个很重要的方法;

剩下两个负责监听javaBean,但是他们都跟HttpSession相关,涉及到session的钝化、活化、序列化这里不做深入研究,这两个倾听器我一直都不知道是干什么用的,知道的人告诉我下,所以我认为基本没什么用;

记住:拿到需求,首先分析你负责的这部分功能需要使用哪些组件来完成,完成的步骤,流程图; 

基于MVC模型开始创建我们的项目我这里用注册来做讲解,比较简单,其实多复杂的业务,也就那么回事,把注册弄会了,其它都会了;

代码我习惯从数据层开始写,每写完一个功能就进行测试,代码注释一定要有;

需求分析:

获取用户从表单传递来的数据,把数据进行bean封装(我提供工具类不用担心,一键封装),将数据传递给业务层(用户名+密码),

业务层中处理登录业务第一步:调用数据层方法从数据库中查询是否有这个用户(findByUserName(String username))

业务层第二步:if()判断用户名是否已经存在,存在就给它抛个异常,带上异常信息让servlet处理;

不存在调用数据层方法(addUser(User user);)将以上逻辑封装到regist(User user);注册方法中,在servlet中调用此方法,并将信息页面转发给用户。

数据层:数据层主要是JDBC技术(提供我自己的Jdbcutils),用其对数据库进行增删改查,我的工具类基本把能封装的都封装了,两三行代码就能完成增删改查,如果是多条件查询,可能需要拼接sql语句,字符串拼接应该难不住你吧。(服务器端验证无非就是if判断,把各种情况想到,就不会出错)

依赖关系 数据层依赖Bean 业务层依赖数据层  servlet依赖业务层  请求依赖servlet(动态页面)

package cn.wyx.dao;

import java.sql.SQLException;
import java.util.List;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;

import com.mchange.v2.c3p0.impl.NewPooledConnection;

import cn.wyx.TxQueryRunner.TxQueryRunner;
import cn.wyx.domain.Java_Book;

public class BookDao {
    private QueryRunner qr = new TxQueryRunner();
    public List<Java_Book> findAll(){
        String sql="select * from Book";
        List<Java_Book> books=null;
        try {
            books = qr.query(sql,new BeanListHandler<Java_Book>(Java_Book.class));
            return books;
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
    public List<Java_Book> findById(String id){
        String sql="select * from Book where id=?";
        try {
            List<Java_Book> books = qr.query(sql, new BeanListHandler<Java_Book>(Java_Book.class), id);
            return books;
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
}

 以上是数据层两个方法演示使用,除了异常处理,就是两三行代码,当然这是因为我的业务比较简单。你要是玩个分页,就需要个大几行了,不过也不难;