MVC模式

MVC模式

MVC全名是Model View Controller是模型视图控制器的缩写,是一种软件设计典范,是一种架构型的模式,本身不引入新功能,只是帮助将开发的结构组织的更加合理。

它使用一种业务逻辑、数据、界面显示分离的方法,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。

最典型的MVC就是 JSP + servlet + javabean 的模式,经常用于请求-响应模型开发中,适用于交互频繁的大中型应用中。

  • Model模型:javabean实现,封装业务逻辑和业务数据
  • View视图:采用 JSP+JSTL 实现,收集客户动作和显示业务数据
  • Controller控制器:采用Servlet实现,流程控制

优点:

  • 1、视图层和业务层分离,耦合度低。
  • 2、多个视图能共享一个模型,重用性高。
  • 3、使开发和维护用户接口的技术含量降低,缩短开发周期,便于分工合作。
  • 4、分离视图层和业务逻辑层也使得应用更易于维护和修改。

缺点:

  • 1、模型和视图要严格的分离,调试繁琐困难。
  • 2、增加系统结构和实现的复杂性,总体难度提高,不适合小中型应用程序。
  • 3、视图与控制器间的过于紧密的连接并且降低了视图对模型数据的访问

JSP和Servlet

Servlet是一个实现了Servlet接口的类,具备Java类的所有特性,能够很好地组织业务逻辑代码访问,但是在Java源文件中,因为是通过字符串拼接的方式生成动态HTML内容,这样就容易导致代码维护困难、可读性差,不能支持所见即所得的开发。

JSP将网页逻辑与网页设计的显示分离,可以规避了Servlet在生成HTML内容方面的劣势,但是在HTML中混入大量、复杂的业务逻辑编码非常繁琐,同时基本不具备代码的可重用性。

JSP究其本质就是Servlet,JSP是包含java代码的HTML网页,Servlet是包含html标签的java类。在具体应用开发中可以考虑协同使用,以达到扬长避短的目的。一般使用Servlet作流程控制,jsp作页面显示和收集客户动作,最终实现显示逻辑和流程控制的分离。

应用开发架构

纯JSP开发:非常简单高效,特别适合微型应用开发,但是代码基本上不具备重用性,开发效率低,难于维护

JSP Model1:简单高效,适合小型项目的开发。但是JSP的职责过于繁重,职责分工不明确。在后期的维护工作非常的苦难

  • 表现层用HTML或JSP
  • JSP文件还负责所有的业务和处理逻辑
  • JSP直接用代码访问数据或JSP通过JavaBean存取数据
  • 以页面为中心,应用程序的业务逻辑和程序流程都在页面中出现
  • JSP要跳转到别的页面,通过超级链接或Form表单的action实现

JSP Mode1 特征:

  • JSP不仅负责表示逻辑,还负责控制逻辑
  • 大型项目中如果采取此方式,每个开发小组必须了解其它小组开发的所有页面的详细信息,否则对页面的修改将会破坏应用程序的流程

JSP Model2:职责清晰,适合大型项目,但是分层过多,不适合小型项目的开发

JSP和Servlet结合的体系结构,是一种把,JSP与Servlet联合使用来实现动态内容服务的方法。吸取了两种技术各自的突出优点,用JSP生成表达层的内容,让Servlet完成深层次的处理任务,Servlet充当控制者的角色,负责管理对清求的处理,创建JSP页需要使用的bean和对象,同时根据用户的动作决定把那个JSP页传给请求者。在JSP页内没有处理逻辑,它仅负责检索原先由Servlet创建的对象或beans,从Servlet中提取动态内容插入静态模板,清晰地分离了表达和内容

在一个典型的J2EE Web应用中,MVC2设计模式包括三个部分:

  • 模型Model:用于封装业务逻辑和业务数据,一般是关系数据或EJB
  • 视图View:数据的表现组件,通常就是JSP页面,也可以是GUI,可以是多个
  • 控制器Controller:接受用户动作,负责统一管理。一般是Servlet

MVC的适用性

  • 它清晰地分离了表达和内容,明确了角色的定义以及开发者与网页设计者的分工。事实上,项目越复杂,使用Model 2体系结构的好处就越大
  • MVC 减弱了业务逻辑接口和数据接口之间的耦合,以及让视图层更富于变化。

具体开发

登录流程:url–>打开输入数据的页面【jspmodel2要求以servlet为核心】

@WebServlet(name = "LoginServlet", value = "/login.do")
public class LoginServlet extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.getRequestDispatcher("login.jsp").forward(request,response);
	}
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	}
}

输入页面【不是直接访问页面,而是通过Servlet跳转页面】

<form action="login.do" method="post">
	<input name="username"/>
	<input type="password" name="password"/>
	<input type="submit" value="登录系统"/>
</form>

由Servlet接收提交的数据

  • 提交提交数据 request.getParameter("username"):String
  • 提交数据的校验
  • 调用业务类执行相应的业务逻辑处理
  • 根据业务处理执行结果跳转不同的页面显示
@WebServlet(name = "LoginServlet", value = "/login.do")
public class LoginServlet extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.getRequestDispatcher("login.jsp").forward(request,response);
	}
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String username=request.getParameter("username");
		String password=request.getParameter("password");
		Map<String,String> errs=new HashMap<>();
		if(username==null || username.trim().length()<1){
			errs.put("username","用户名称不能为空!");
		}
		if(password==null || password.trim().length()<1){
			errs.put("password","用户口令不能为空!");
		}
		if(errs.size()>0){
			request.setAttribute("errors",errs);
			request.getRequestDispatcher("login.jsp").forward(request,response);
			return;
		}
		IUserDao userDao=new UserDaoImpl();
		User user=new User();
		user.setUsername(username);
		user.setPassword(password);
		boolean bb= userDao.login(user);
		if(bb){
			HttpSession session=request.getSession();
			session.setAttribute(Constants.LOGIN_INFO,user);
			response.sendRedirect("show.do");
		}else{
			request.setAttribute("msg","登录失败!请重试");
			request.getRequestDispatcher("login.jsp").forward(request,response);
		}
	}
private DateFormat df=new SimpleDateFormat("yyyy-MM-dd");//错误的
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值