MVC模式-----------JSP+Servlet的组合使用

 JSP可以完全代替Servlet的功能,为什么还需要Servlet呢?

 Servlet是通过使用api的方式来给用户输出网页,网页非常大的时候(比如电商网站),会导致业务逻辑跟输出网页的代码混在一起,

看起来杂乱无章,并且单双引号的问题也可能难倒一部分人,即使是对有经验的工程师,也可能会加重编码负担。

但是Servlet的这个缺点也成就了它的优点:在java类中,比较适合我们处理常用的业务逻辑,比如连接数据库,进行计算,各种逻辑判断等等。

 JSP跟接近传统HTML页面,非常适合输出页面,但假如要进行一些逻辑的判断,就需要嵌入java脚本(<%%>),当这种java脚本太多时,也会造成页面看起来非常凌乱,以后修改起来非常麻烦。

早期的一些有经验的工程师逐渐摸索出了一个两全其美的解决方案,那就是MVC开发模式。

 MVC:是模型(model)-视图(view)-控制器(controller)的缩写。模型层包括一些业务逻辑,数据库操作等;视图层即页面元素;控制层主要

是用于接收请求,然后控制业务流程,并且选择返回的视图。也就是说通过这种分层的模型,来达到页面元素和业务逻辑分离的目的,而控制

层就是连接这两端的中间层。

JavaWeb中,Jsp可以作为视图层,用于显示动态网页;Servlet可以作为我们的控制层,用于接收用户请求,然后调用业务逻辑代码,最后通过redirectforward的方式给用户返回页面(如Jsp)。而Servlet中调用的业务逻辑代码,可以封装成某些类的方法,这些类其实就相当于模型层。

之前我们使用ServletJsp分别实现了登录功能,现在我们看看怎样用MVC模式来实现。

首先新建一个web项目。打开index.jsp,编写登陆表单。

<formaction="<%=path%>/servlet/LoginServlet"method="post">

 <table>

 <tr><td>姓名</td><td><inputtype="text" name="username"/></td></tr>

 <tr><td>年龄</td><td><inputtype="password" name="password"/></td></tr>

 <tr><td><input type="submit" value="登录"/></td><td>&nbsp;</td></tr>

 </table>

 </form>

LoginServlet是我们的登陆Servlet,也就是控制层doPost方法代码如下:

       String username =request.getParameter("username");

       String password =request.getParameter("password");

       String path=request.getContextPath();

       if(username.trim().equals("admin") &&password.trim().equals("123456")) {

        request.setAttribute("message","登陆成功");

     request.getRequestDispatcher("/success.jsp").forward(request,

         response);

      } else {

        request.setAttribute("message","账号密码错误,请重试");

        request.getRequestDispatcher("/error.jsp")

         .forward(request,response);

       }

解释:我们在接收了用户的请求信息后,判断登陆账号是否正确,假如正确则把成功信息提示保存到request域里,

然后把请求转发到成功提示页面success.jsp

     success.jsp中的核心代码如下:

     <font color='red'>${requestScope.message}</font>

     error.jsp中的核心代码如下:

     <fontcolor='red'>${requestScope.message}</font>

在实际开发中,每个项目都有一个公共的成功或失败页面,而页面上显示的提示都是依照业务逻辑的不同而不同,

在这里我们把错误信息放到request域里,就可以在页面中通过得到request域里的message属性来显示提示信息了,

以后假如还有别的提示信息,只需要在把request域里的message设置成不同提示信息就行了,页面几乎不用修改。

为什么Servlet在跳转的时候不用redirect而是用forward

当我们把forward换成redirect方式后,发觉信息提示根本显示不出来,因为forward是请求转发,在转发后的页面可以获取

     request域中的值,而redirect是请求重定向,会截断前面请求域中的数据,所以在跳转后的页面中获取不到值。

基于MVC的登陆流程梳理:index.jsp里有个登录表单,提交表单会把数据提交到LoginServletLoginServlet在这里只作为控制层,

用于接收用户请求,进行登录验证(业务逻辑),验证通过则在请求域中保存提示信息,然后请求转发到成功页面(success.jsp)

并在success.jsp中取得request域中的数据,验证不通过则跳转到失败页面。