什么是MVC?用一个具体的案例来详谈mvc

详解MVC开发模式

一、MVC的设计模式的由来
JSP Model1是JavaWeb早期的模型,程序的Java代码和HTML强藕合在一起,导致视图和逻辑无法分离,导致程序的可读性很差,代码调试以及后期维护都带来了很大的问题.

总之我认为Model完全就是jsp处理所有的问题
Model1第一代:
什么是MVC?用一个具体的案例来详谈mvc_第1张图片
Model1第二代,把业务逻辑放到JavaBean中去了:
什么是MVC?用一个具体的案例来详谈mvc_第2张图片
Jsp Model2
在Jsp Model2时代,Jsp视为View,Servlet视为Controller,JavaBean为Model,其中Servlet作为Jsp和JavaBean的纽带
适合很多人合作开发大型的项目,各司其职,有利于开发的分工,可以使项目的需求更大,同时对开发人员的要求也随之变高了
什么是MVC?用一个具体的案例来详谈mvc_第3张图片
二,什么是JavaBean和内省
JavaBean的特点
1.这个类有无参的构造方法
2.属性私有化
3.私有化的属性必须通过public类型的方法暴露给其他的程序,并且方法的命名也符合特定的规范
JavaBean的作用:
通常用来封装数据,对应遵循以上特点的写法的,其他的程序可以通过反射实例化技术实例化JavaBean,从中获取JavaBean的属性,进而获取其数据
内省技术:
内省技术是基于反射技术实现的,通过属性构造器来获取属性的对应的getter和setter方法,然后通过反射机制来调用方法,Apache组织开发了一套基于JavaBean的API,因此在这套开发中,使用BeanUtils的使用,以简化程序代码的实现

案例
编写注册页面,完成注册页面的校验,完成用户的注册和登录功能

项目需求分析:
技术:采用servlet + JavaBean +JSP
封装数据
BeanUtils
JSP显示
JSTL + JSP
解析xml
DOM4J解析xml

//项目流程
首先环境准备
新建web项目,导入相对于jar包
创建数据库,在磁盘上创建一个user.xml文件
包结构:

什么是MVC?用一个具体的案例来详谈mvc_第4张图片
注册界面的实现,主要涉及form表单的提交以及前台数据的校验

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>




注册界面

   


     ${msg }
     <%-- form表单提交, onsubmit前提校验    --%>
     
用户名
密码
确认密码
昵称
邮箱
验证码

什么是MVC?用一个具体的案例来详谈mvc_第5张图片
验证码的实现的servlet,前面有文章具体的都讲过了,此时不在多讲,直接撸代码

package cn.itcast.action;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * 验证码的实现
 * @author liugang
 *
 */
public class CheckCodeServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//获取画布
		int width = 120;
		int height = 30;
		BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
		//获取画笔对象(为了调用改变干扰线的方法,调用子类的方法,强制一下)
		Graphics2D g = (Graphics2D) image.getGraphics();
		g.setColor(Color.YELLOW);
		//设置填充矩形
		g.fillRect(0, 0, width, height);
		//设置边框
		g.setColor(Color.BLUE);
		g.drawRect(0, 0, width-1, height-1);
		//准备数据,随机获取字符串常用字符
		String words = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";

		
		//生成存入到session中
		StringBuffer sb = new StringBuffer();
		
		//设置颜色
		g.setColor(Color.RED);
		//设置字体
		g.setFont(new Font("隶书",Font.BOLD, 20));
		
		Random random = new Random();
		int x = 20;
		int y = 20;
		
		for(int i = 0;i < 4;i++){
			//每个字符的旋转方向获取30到60之间的角度
			int jiaodu = random.nextInt(30)-60;
			double hudu = jiaodu * Math.PI / 180;
			g.rotate(hudu,x,y);
			//获取下标
			int index = random.nextInt(words.length());
			//返回指定下标位置的字符,随机获取下标
			char ch = words.charAt(index);
			
			//添加字符
			sb.append(ch);
			
			//写字符串
			g.drawString(ch+"", x, y);
			g.rotate(-hudu,x,y);
			x+=20;
		}
		
		//存入session中
		request.getSession().setAttribute("sessionCode", sb.toString());
		
		//设置颜色和设置线
		g.setColor(Color.GREEN);
		int x1,y1,x2,y2;
		for(int i = 0;i < 4;i++){
			x1 = random.nextInt(width);
			y1 = random.nextInt(height);
			x2 = random.nextInt(width);
			y2 = random.nextInt(height);
			g.drawLine(x1, y1, x2, y2);
		}
		
		//将对象写出到浏览器上
		ImageIO.write(image, "jpg", response.getOutputStream());

	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);

	}

}

service层,不断的解析数据,完成对具体业务的实现,此时只有注册和登录的两个业务

package cn.itcast.service;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.Element;

import cn.itcast.utils.MyXmlUtil;
import cn.itcast.vo.User;
/**
 * 操作xml数据
 * 处理数据,完成相关的操作
 * @author liugang
 */
public class RegService {
    /**
     * 操作xml,完成注册,xml中进行数据的添加
     * 用户名不能重名
     * 邮箱不能重名
     * @throws Exception 
     */
	@SuppressWarnings({ "unchecked", "null" })
	public int regUser(User user) throws Exception{
		
		//使用工具类,操作xml
		Document document = MyXmlUtil.getDocument(MyXmlUtil.PATH);
		//解析xml
		//获取根节点
		Element root = document.getRootElement();
		
		
		//检验用户名和密码是否重名
		List uList = root.elements("user");
		//xml中查询,和传过来的值做对比,如果相同的,则名字重名了,返回
		if (uList != null || uList.size() > 0) {
			//从xml中获取
			for (Element u : uList) {
				//获取节点后的姓名文本内容
				String xmlName = u.elementText("username");
				//获取传递进来的User的名称
				String uname = user.getUsername();
				//重名了,返回1
				if (xmlName.equals(uname)) {
					return MyXmlUtil.NAMEEXIST;
				}
				
				//返回获取节点的邮箱的内容
				String XmlEmail = u.elementText("email");
				String uemail = user.getEmail();
				//将传入的email值和文件里的值进行对比
				if (XmlEmail.equals(uemail)) {
					return MyXmlUtil.EMAILEXIST;
				}
				
			}
		}
		
		//需要在xml下添加节点
		Element uElement = root.addElement("user");
		uElement.addElement("username").setText(user.getUsername());
		uElement.addElement("password").setText(user.getPassword());
		uElement.addElement("nickname").setText(user.getNickname());
		uElement.addElement("email").setText(user.getEmail());
		
		//回写
		MyXmlUtil.writeXml(document, MyXmlUtil.PATH);
		//返回1用户名重名了,返回2是邮箱重名,返回0注册成功了
		return MyXmlUtil.SUCCESS;
	} 
    //登录功能的判断
	@SuppressWarnings({ "unchecked", "null" })
	public User loginUser(User user) throws Exception {
		//从xml中获取用户名和密码的文本内容
		Document document = MyXmlUtil.getDocument(MyXmlUtil.PATH);
		//获取根节点
		Element root = document.getRootElement();
		//获取User的节点
		List ulist = root.elements();
		if (ulist !=null || ulist.size() > 0) {
			for (Element u : ulist) {
				//获取username和password的文本内容
				String xmlName = u.elementText("username");
				String uName = user.getUsername();
				
				String xmlPass = u.elementText("password");
				String uPass = user.getPassword();
				if (uName.equals(xmlName) && uPass.equals(xmlPass)) {
					//由于只有定义了姓名和密码却没有定义昵称和邮箱,故可以把邮箱也加入进去
					user.setNickname(u.elementText("nickname"));
					user.setEmail(u.elementText("email"));
					return user;
				}
			}
		}
		return null;
	}
}

xml解析的工具类,更加简便于service层代码的书写

package cn.itcast.utils;
import java.io.FileOutputStream;
import org.dom4j.Document;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

/**
 * xml的工具类(dom4j对数据的解析)
 * @author liugang
 *
 */
public class MyXmlUtil {
	//数据库路径
	public static final String PATH = "d:\\user.xml";
    //用户名重名
	public static final int NAMEEXIST = 1;
    //邮箱重名
	public static final int EMAILEXIST = 2;
    //注册成功
	public static final int SUCCESS = 0;
	//获取Document
	public static Document getDocument(String path) throws Exception{
		//获得解析器对象
		SAXReader reader = new SAXReader();
		//解析对象获取document对象
		return reader.read(path);		
	}
	
	//回写(XMLWriter)
	public static void writeXml(Document document,String path) throws Exception{
		//创建一个好看的格式
		OutputFormat format = OutputFormat.createPrettyPrint();
		//设置编码
		format.setEncoding("UTF-8");
		//创建回写对象
		XMLWriter writer = new XMLWriter(new FileOutputStream(path),format);
		//回写
		writer.write(document);
		//关闭流
		writer.close();
	}
	
}

pojo类

package cn.itcast.vo;
/**
 * User对象
 * @author liugang
 * pojo类
 */
public class User {
    
	private String username;
	private String password;
	private String nickname;
	private String email;
	public User() {
		super();
		// TODO Auto-generated constructor stub
	}
	public User(String username, String password, String nickname, String email) {
		super();
		this.username = username;
		this.password = password;
		this.nickname = nickname;
		this.email = email;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getNickname() {
		return nickname;
	}
	public void setNickname(String nickname) {
		this.nickname = nickname;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	@Override
	public String toString() {
		return "User [username=" + username + ", password=" + password
				+ ", nickname=" + nickname + ", email=" + email + "]";
	}
	
	
}

登陆界面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>




登录界面


    ${msg }
    
输入姓名:
输入密码:
记住用户名

什么是MVC?用一个具体的案例来详谈mvc_第6张图片
登录成功

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>




Insert title here


登录成功

${user2.username }

昵称:${succUser.nickname }

邮箱:${succUser.email }

什么是MVC?用一个具体的案例来详谈mvc_第7张图片
以上是我对Java的Mvc模式的简单总结,等学完mysql数据库和ajxs等知识后会再次总结,如果对上面的源码有兴趣,欢迎给我留言,我会立马把源码封上

你可能感兴趣的:(Javaweb)