Java web MVC和三层架构的理解

参考文章:https://www.cnblogs.com/whgk/p/6435300.html

一.servlet和jsp
Servlet就是为了解决静态页面的问题,能够实现动态的页面,使维护,开发更加的方便,但是也有缺点,在Servlet嵌入HTML代码实在是太麻烦了,每次都要out.println();输出。所以就有了Jsp,JSP中的内容就是html,为的就是方便写html,写页面,本质上JSP也是一个servlet,所以在它中也会不可避免的要写一些java代码,也就是脚本,为了不让其那么混乱,就增加了标签,EL表达式来尽量代替脚本。但是在写一些项目时,还是会很麻烦,原因是业务逻辑代码,与数据库交互的代码,HTML代码这些类别,风格,作用完全不同的都混杂在了一起,造成的结果是代码的维护性,可读性以及扩张性都非常差,比如要改一个需求,那么必须要把全部代码都看完,理解到,不然你可能会因为修改了一处代码,导致别的地方多处错误。
二.MVC
MVC:模型-视图-控制层
模型层:存储业务数据和数据库数据
视图层:将获取的结果在jsp页面上展示
控制层:servlet对用户的请求进行处理
例子(注册请求):用户在jsp页面上发起注册请求----->control(servlet)对用户的请求进行分析----->从model中获取注册所需的数据---->一般这里还会有个services层对模型进行业务处理(注册需要进行判断用户名是否重复,没有重复则添加用户)---->再通过control层将将结果返回到jsp页面上展示给用户
在这里插入图片描述
三.三层架构
下面这张图很好的展示了三层架构之间的关系,web表示层,services处理数据,dao直白一点就是增删改查,这里业务逻辑处理和数据处理要分开
在这里插入图片描述
这里的services其实只是调用dao层中的方法,可能有时候会觉得这样写的代码会又臭又长,但是一旦要处理的业务逻辑变多时,这时候services的作用就体现出来了,还是以上面的注册为例子:
注册需要进行的查找和插入操作,这是一个简单的需求。比如我需要加一步操作,统计注册的人数,那这里在dao层中修改代码是很麻烦的,而且有可能引起代码结构的混乱,不方便管理。如果我在services中进行操作,那我只需要调用dao层中的查找方法就行,对以后代码的维护也比较简单。这是一种模块、结构化的思想。

例子代码:(以注册为例)
三层架构:
在这里插入图片描述
在index首页上点击登录
在这里插入图片描述

<%
Object user=session.getAttribute("user");
if(user==null){
	%>
	<a href="<%=request.getContextPath()%>/register.jsp">注册</a>
	<a href="<%=request.getContextPath()%>/login.jsp">登录</a>
	
	<%
}else{
	User u=(User)user;
	out.print("当前登录用户是:"+u.getUsername());
}

%>
<br>
各种商品展示

跳转到登录页面
在这里插入图片描述
post跳转到login_do

<%
if(request.getAttribute("msg")!=null){
	out.print(request.getAttribute("msg")+"<br/>");
}

%>

<form action="login_do" method="post">
用户名:<input type="text" name="username"><br>
密码:<input type="text" name="password"><br>
<input type="submit" value="登录">
</form>

login_do代码

package com.Fang.controller;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.Fang.model.User;

import service.UserService;

@WebServlet("/login_do")
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String username=request.getParameter("username");
		String password=request.getParameter("password");
		UserService userService=new UserService();
		User user=userService.login(username, password);//判断用户是否存在
		if(user!=null) {//如果返回值不为null
			request.getSession().setAttribute("user", user);//设置user属性
			if(user.isAdmin()) {//判断是否是管理员
				request.getRequestDispatcher("/Admin/good_list").forward(request, response);//是管理员跳转到商品管理列表
			}else {
				request.getRequestDispatcher("/").forward(request, response);//不是跳转到首页
			}
			
		}else {//用户名或者密码错误,留在当前的login页面
			request.setAttribute("msg", "<font color='red'>用户名或者密码错误</font>");
			request.getRequestDispatcher("/login.jsp").forward(request, response);
		}
		
		
	}

}

因为登录账号是管理员,跳转到商品管理
在这里插入图片描述
附上源码:
链接:https://pan.baidu.com/s/17b9mVXa_SaP-MbIj-GhhNQ
提取码:5zhc
复制这段内容后打开百度网盘手机App,操作更方便哦

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值