一、MVC的设计模式的由来
JSP Model1是JavaWeb早期的模型,程序的Java代码和HTML强藕合在一起,导致视图和逻辑无法分离,导致程序的可读性很差,代码调试以及后期维护都带来了很大的问题.
总之我认为Model完全就是jsp处理所有的问题
Model1第一代:
Model1第二代,把业务逻辑放到JavaBean中去了:
Jsp Model2
在Jsp Model2时代,Jsp视为View,Servlet视为Controller,JavaBean为Model,其中Servlet作为Jsp和JavaBean的纽带
适合很多人合作开发大型的项目,各司其职,有利于开发的分工,可以使项目的需求更大,同时对开发人员的要求也随之变高了
二,什么是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文件
包结构:
注册界面的实现,主要涉及form表单的提交以及前台数据的校验
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
注册界面
${msg }
<%-- form表单提交, onsubmit前提校验 --%>
验证码的实现的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 }
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
登录成功
${user2.username }
昵称:${succUser.nickname }
邮箱:${succUser.email }
以上是我对Java的Mvc模式的简单总结,等学完mysql数据库和ajxs等知识后会再次总结,如果对上面的源码有兴趣,欢迎给我留言,我会立马把源码封上