MVC模式-----------JSP+Servlet的组合使用
JSP可以完全代替Servlet的功能,为什么还需要Servlet呢?
Servlet是通过使用api的方式来给用户输出网页,网页非常大的时候(比如电商网站),会导致业务逻辑跟输出网页的代码混在一起,
看起来杂乱无章,并且单双引号的问题也可能难倒一部分人,即使是对有经验的工程师,也可能会加重编码负担。
但是Servlet的这个缺点也成就了它的优点:在java类中,比较适合我们处理常用的业务逻辑,比如连接数据库,进行计算,各种逻辑判断等等。
JSP跟接近传统HTML页面,非常适合输出页面,但假如要进行一些逻辑的判断,就需要嵌入java脚本(<%%>),当这种java脚本太多时,也会造成页面看起来非常凌乱,以后修改起来非常麻烦。
早期的一些有经验的工程师逐渐摸索出了一个两全其美的解决方案,那就是MVC开发模式。
MVC:是模型(model)-视图(view)-控制器(controller)的缩写。模型层包括一些业务逻辑,数据库操作等;视图层即页面元素;控制层主要
是用于接收请求,然后控制业务流程,并且选择返回的视图。也就是说通过这种分层的模型,来达到页面元素和业务逻辑分离的目的,而控制
层就是连接这两端的中间层。
在JavaWeb中,Jsp可以作为视图层,用于显示动态网页;Servlet可以作为我们的控制层,用于接收用户请求,然后调用业务逻辑代码,最后通过redirect或forward的方式给用户返回页面(如Jsp)。而Servlet中调用的业务逻辑代码,可以封装成某些类的方法,这些类其实就相当于模型层。
之前我们使用Servlet和Jsp分别实现了登录功能,现在我们看看怎样用MVC模式来实现。
首先新建一个web项目。打开index.jsp,编写登陆表单。
姓名 年龄 登录"/>
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中的核心代码如下:
${requestScope.message}
error.jsp中的核心代码如下:
在实际开发中,每个项目都有一个公共的成功或失败页面,而页面上显示的提示都是依照业务逻辑的不同而不同,
在这里我们把错误信息放到request域里,就可以在页面中通过得到request域里的message属性来显示提示信息了,
以后假如还有别的提示信息,只需要在把request域里的message设置成不同提示信息就行了,页面几乎不用修改。
为什么Servlet在跳转的时候不用redirect而是用forward?
当我们把forward换成redirect方式后,发觉信息提示根本显示不出来,因为forward是请求转发,在转发后的页面可以获取
request域中的值,而redirect是请求重定向,会截断前面请求域中的数据,所以在跳转后的页面中获取不到值。
基于MVC的登陆流程梳理:index.jsp里有个登录表单,提交表单会把数据提交到LoginServlet;LoginServlet在这里只作为控制层,
用于接收用户请求,进行登录验证(业务逻辑),验证通过则在请求域中保存提示信息,然后请求转发到成功页面(success.jsp),
并在success.jsp中取得request域中的数据,验证不通过则跳转到失败页面。