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