以前的文章,咱们主要是介绍了jsp的相关语法操做,咱们能够经过请求某个jsp页面,而后由相对应的servlet实例给咱们返回html页面。可是在实际的项目中,咱们不多会直接的请求某个页面,通常都是请求某个URL,而后由咱们的拦截器解析这个URL,调用model层处理一些逻辑判断或者数据取出等,最后会调用view将页面信息返回。这就是典型的MVC架构模式。本篇文章将会从一个简单的实例了解一下,MVC模式下的Java是如何实现的。
首先,咱们须要知道在Java中,到底是哪些模块充当Controler,View,Model。在Java中,使用servlet充当controler,使用javabean充当model,使用jsp充当view。咱们首先看看如何使用servlet充当controler的角色。咱们以前曾经讲jsp的时候看过servlet实例的源代码,那是编译器自动生成的,并非咱们写的。若是咱们想要用servlet做为拦截器使用,就必需要本身实现一个servlet实例。每一个servlet必须继承HttpServlet这个抽象类。也就是说,若是你想要使用servlet做为拦截器就须要继承抽象类HttpServlet,重写其某些方法。html
public abstract class HttpServlet{ void doGet() void doPost() void doPut() void doDelete() void service() }
HttpServlet这个类提供了不少的默认实现方法,有用于响应用户get请求的方法,post请求方法,put请求方法等,service这个方法用于响应客户端全部请求,因此咱们通常只须要重写这个方法就能够来实现对用户全部请求的响应。java
@WebServlet(name="myservlet",urlPatterns = {"/walker"}) public class Test_class extends HttpServlet { @Override public void service(HttpServletRequest req, HttpServletResponse resp) throws IOException { OutputStream outputStream = resp.getOutputStream(); PrintStream printStream = new PrintStream(outputStream); printStream.println("<html>"); printStream.println("<head>"); printStream.println("</head>"); printStream.println("<body>"); printStream.println("<h1>hello world</h1>"); printStream.println("</body>"); printStream.println("</html>"); } }
第一行是webservle注解,指定该servlet用于响应什么URL,咱们指定的walker,也就是当咱们在浏览器上输入walker地址将由此servlet响应咱们的请求。
web
下面的内容想必你们都是能看懂的,毕竟在介绍jsp内置对象的时候介绍过response是能够获取一个输出到客户端的输出流的。咱们能够将html代码输出到用户端。(响应用户请求)此处servlet并无做为拦截器,这里只是演示如何使用servlet响应用户请求,关于servlet做为拦截器的内容下文介绍。
下面说说充当model的Javabean,javabean其实就是一种规范,他以严格的命名规范要求全部的属性必须设置为私有的,而且必须提供setXXX,getXXX方法,将属性暴露。sql
public class Model { private String name; private int age; public String getName(){ return this.name; } public void setName(String name){ this.name = name; } public int getAge(){ return this.age; } public void getAge(int age){ this.age = age; } //..........一些逻辑控制代码... }
这就是一个符合Javabean规范的model类,其中,除了定义一些属性以外,咱们还能够定义一些能够控制逻辑走向的代码,也就是能够在这里面定义一些方法用来完成一些功能,例如链接数据库,查询出符合某条件的结果集等。具体的最后会以一个例子演示。
对于view层,咱们使用的jsp技术,它主要用来呈现由model层处理完的数据。具体的语法已经在以前的文章中介绍过了,此处再也不赘述,下面咱们经过一个登录的例子来感觉一下MVC架构。代码有点长,咱们慢慢看。数据库
@WebServlet(name="Test_class",urlPatterns = {"/login"}) public class Test_class extends HttpServlet { @Override public void service(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException { RequestDispatcher rd = req.getRequestDispatcher("/login.jsp"); rd.forward(req,resp); } } /////login.jsp <html> <head> <title>登陆注册</title> </head> <body> <form method="post" action="/index"> 姓名:<input type="text" name="name" /><br /><br /> 密码:<input type="password" name="pwd" /> <input type="submit" value="提交" /> </form> </body> </html>
以上是一个简化了的MVC模式, servlet:Test_class 做为拦截器,login.jsp做为view展现层,只是没有逻辑控制层,由于这个不须要逻辑控制,只是一个拦截跳转页面。咱们看到login页面的form表单提交的目的地是:index拦截器。浏览器
@WebServlet(name="index",urlPatterns = {"/index"}) public class index extends HttpServlet { @Override public void service(HttpServletRequest req, HttpServletResponse resp) throws IOException { req.setCharacterEncoding("UTF-8"); String name = req.getParameter("name"); String pwd = req.getParameter("pwd"); Model model = new Model(); Connection con =model.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=FitWeb", "sa", "123456"); try { RequestDispatcher rd = req.getRequestDispatcher("/index.jsp"); if(model.sureLogin(con,name,pwd)){ req.setAttribute("mes","登陆成功"); }else{ req.setAttribute("mes","登陆失败"); } rd.forward(req,resp); } catch (SQLException e) { e.printStackTrace(); } catch (ServletException e) { e.printStackTrace(); }finally { try { con.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
咱们能够看到,在这个页面里面,咱们首先指定了响应编码方式,而后接受表单提交的全部信息。建立一个Javabean的model层,由于拦截器不负责逻辑代码,主要的逻辑代码仍是在model层,咱们看model层代码,等会回来接着看index拦截器。架构
public class Model { private String name; private String pwd; public String getName(){ return this.name; } public void setName(String name){ this.name = name; } public String getAge(){ return this.pwd; } public void getAge(String pwd){ this.pwd = pwd; } public Connection getConnection(String url,String name,String pwd){ Connection con=null; try { Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); con = DriverManager.getConnection(url,name,pwd); }catch (Exception e){ e.printStackTrace(); } return con; } public boolean sureLogin(Connection con,String name,String pwd) throws SQLException { PreparedStatement ps = con.prepareStatement("SELECT * from users WHERE name =? AND pass=?"); ps.setString(1,name); ps.setString(2,pwd); ResultSet rs = ps.executeQuery(); if(rs.next()){ return true; }else{ return false; } } }
整个model层主要定义了两个方法,一个是获取数据库链接对象,一个是用来校验用户名和密码是否正确的方法。其他的都是属性,全部属性必须彻底按照Javabean规范命名和定义getXXX,setXXX方法。这两个方法很简单,若是不清楚的能够查看上篇文章。接着咱们回到index拦截器。
try语句块中,定义了RequestDispatcher 用来实现页面的跳转,这是一个很重要的方法,由于拦截器不会用来直接响应用户,一定是调用jsp做为view层响应用户,因此这个跳转语句几乎是每一个拦截器都会有的。判断用户名和密码,而后req.setAttribute方法,增长一个参数在当前request请求中,以便jsp页面能够获取接受。最后跳转页面,经过jsp页面展现结果。下面是运行的截图。
jsp
你们能够看到,在整个过程当中,地址栏中的URL始终都是拦截器的URL。这更加的证实了咱们MVC架构的优势,经过拦截器拦截URL解析而后响应用户,若是遇到不正常的URL,直接拦截跳转错误页面。ide
本篇结束,主要仍是从客观上感觉了MVC架构的每一层所负责的任务。若是做者有理解错误,望你们指出!sqlserver