java开发模型_java开发模型MVC
常見的三種開發(fā)模型:
1、
Model1:JSP+JavaBean
2、
Model2:MVC
3、Model2+三層架構(gòu)
今天就重點(diǎn)學(xué)習(xí)一下Model2+三層架構(gòu)的編程思想。三層架構(gòu)主要包括:表現(xiàn)層、業(yè)務(wù)邏輯層、數(shù)據(jù)訪問層。我們?cè)谟萌龑涌蚣芫帉懗绦虻臅r(shí)候,一定要按照需求來寫我們的程序。這樣既有利于程序的快速搭建整體框架,同時(shí)又使我們自己的思路相對(duì)清晰,從而提高效率。
下面來看一個(gè)簡(jiǎn)單的實(shí)例:
簡(jiǎn)單的注冊(cè)和登錄信息
要求如下:
XXX網(wǎng)站
注冊(cè):
用戶名:
密碼:
重復(fù)密碼:
郵箱:
生日:
有一個(gè)簡(jiǎn)單的注冊(cè)頁(yè)面,外加一個(gè)登錄頁(yè)面,登錄使用注冊(cè)信息中的用戶名和密碼。
那么,看到這個(gè)簡(jiǎn)單的需求后如何展開我們的編程呢?我想對(duì)于一個(gè)新手來說。感覺有點(diǎn)丈二和尚摸不著頭腦,如果你跟我一樣,那么請(qǐng)看下面,我們一起來學(xué)習(xí)學(xué)習(xí)。
編寫步驟:
一、需求分析:
注冊(cè)頁(yè)面包括寫什么信息,我們?nèi)绾卧O(shè)計(jì)JavaBean呢?我們?nèi)绾味x接口呢?我們?nèi)绾螌?shí)現(xiàn)接口呢?我們?nèi)绾伪WC我們的接口可行呢?
(1)、根據(jù)需求分析,我們?cè)O(shè)計(jì)JavaBean(包括 username password email birthday)User。
所以我們定義的類如下:
package?com.zcp.domain;
import?java.util.Date;
public?class?User?{
private?String?username;//唯一
private?String?password;
private?String?email;
private?Date?birthday;
public?User(){}
public?User(String?username,?String?password,?String?email,?Date?birthday)?{
super();
this.username?=?username;
this.password?=?password;
this.email?=?email;
this.birthday?=?birthday;
}
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?getEmail()?{
return?email;
}
public?void?setEmail(String?email)?{
this.email?=?email;
}
public?Date?getBirthday()?{
return?birthday;
}
public?void?setBirthday(Date?birthday)?{
this.birthday?=?birthday;
}
@Override
public?String?toString()?{
return?"User?[username="?+?username?+?",?password="?+?password
+?",?email="?+?email?+?",?birthday="?+?birthday?+?"]";
}
}
(2)、定義業(yè)務(wù)接口。我們主要實(shí)現(xiàn)注冊(cè)和登錄。所以業(yè)務(wù)接口就定義如下:package?com.zcp.service;
import?com.zcp.domain.User;
import?com.zcp.exception.UserHasExistException;
public?interface?BusinessService?{
//拋出有補(bǔ)救措施的異常
/**
*?注冊(cè)新用戶
*?@param?封裝了用戶信息的user對(duì)象
*?@throws?UserHasExistException?如果用戶名已經(jīng)存在,拋出此異常
*?*/
void?regist(User?user)?throws?UserHasExistException;
/**
*?用戶登錄
*?@param?username?用戶名
*?@param?password?密碼
*?@return?用戶名或者密碼錯(cuò)誤,返回null
*?*/
User?login(String?username,String?password);
}
(3)、實(shí)現(xiàn)業(yè)務(wù)接口:(注意:這里沒有真實(shí)的數(shù)據(jù)庫(kù),只有用xml組成簡(jiǎn)單的數(shù)據(jù)庫(kù)。理解一下,我也是新手額)
package com.zcp.service.impl;
import com.zcp.dao.UserDao;
import com.zcp.dao.impl.UserDaoXmlImpl;
import com.zcp.domain.User;
import com.zcp.exception.UserHasExistException;
import com.zcp.service.BusinessService;
public class BusinessServiceImpl implements BusinessService {
private UserDao dao = new UserDaoXmlImpl();
public void regist(User user) throws UserHasExistException {
//根據(jù)用戶名查詢用戶名是否存在
User dbUser = dao.findByUsername(user.getUsername());
if(dbUser != null){
throw new UserHasExistException("用戶名:"+ user.getUsername()+"已經(jīng)存在了");
}
dao.save(user);
}
public User login(String username, String password) {
return dao.findUser(username,password);
}
}
(4)、在實(shí)現(xiàn)業(yè)務(wù)接口的時(shí)候肯定是需要訪問數(shù)據(jù)庫(kù)的,所以自然就想到需要dao層。所以我需要定義在實(shí)現(xiàn)業(yè)務(wù)接口中的dao的接口并實(shí)現(xiàn);
dao接口的定義:
package com.zcp.dao;
import com.zcp.domain.User;
public interface UserDao {
/**
* 根據(jù)用戶名查詢用戶是否存在
* @param username
* @return 不存在返回null
* */
User findByUsername(String username);
/**
* 保存用戶信息
* @param user
*
* */
void save(User user);
/**
* 根據(jù)用戶名和密碼查詢
* @param username
* @param password
* @return 查詢到用戶返回User,用戶名或者密碼錯(cuò)誤返回null
* */
User findUser(String username, String password);
}
dao接口中的實(shí)現(xiàn):(注意這里是用xml的形式保存的,如果對(duì)xml解析不熟悉。請(qǐng)查閱相關(guān)的xml知識(shí))
package com.zcp.dao.impl;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import com.zcp.dao.UserDao;
import com.zcp.domain.User;
import com.zcp.util.Dom4jUtil;
public class UserDaoXmlImpl implements UserDao {
public User findByUsername(String username) {
try {
Document doc = Dom4jUtil.getDocument();
Node node = doc.selectSingleNode("//user[@username='"+username+"']");
if(node == null){
return null;
}
String xmlBirthday = node.valueOf("@birthday");
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
Date birthday = df.parse(xmlBirthday);
User user = new User(node.valueOf("@username"), node.valueOf("@password"), node.valueOf("@email"), birthday);
return user;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public void save(User user) {
//
try {
Document doc = Dom4jUtil.getDocument();
Element eroot =doc.getRootElement();
eroot.addElement("user").addAttribute("username", user.getUsername())
.addAttribute("password", user.getPassword())
.addAttribute("email", user.getEmail())
.addAttribute("birthday", user.getBirthday().toLocaleString());
Dom4jUtil.write2xml(doc);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public User findUser(String username, String password) {
/*try {
Document doc = Dom4jUtil.getDocument();
//Node node = doc.selectSingleNode("//user[@username='"+username+"']");
//Node node = doc.selectSingleNode("//user[@username='"+username+"' and @password='"+password+"']");
//
Node node = doc.selectSingleNode("//user[@username='"+username+"' and @password='"+password+"']");
if(node == null){
return null;
}
String xmlbirthday = node.valueOf("@birthday");
DateFormat df = new SimpleDateFormat();
Date birthday = df.parse(xmlbirthday);
User user = new User(node.valueOf("@username"), node.valueOf("@password"), node.valueOf("@email"), birthday);
return user;
} catch (Exception e) {
throw new RuntimeException(e);
}*/
try {
Document doc = Dom4jUtil.getDocument();
//List userNodes = doc.selectNodes("//user");
Node node = doc.selectSingleNode("//user[@username='"+username+"' and @password='"+password+"']");
if(node==null)
return null;
String xmlBirthday = node.valueOf("@birthday");
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
Date birthday = df.parse(xmlBirthday);
User user = new User(node.valueOf("@username"), node.valueOf("@password"), node.valueOf("@email"), birthday);
return user;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
(5)在實(shí)現(xiàn)dao的時(shí)候,由于是采用的xml的形式。所以自然想到可以寫一個(gè)簡(jiǎn)單的工具類,能夠解析xml并且可以保存;所以順理成章的就寫了一個(gè)簡(jiǎn)單的工具類;
package com.zcp.util;
import java.io.FileOutputStream;
import java.net.URL;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class Dom4jUtil {
private static String xmlRealpath;
static{
ClassLoader cl = Dom4jUtil.class.getClassLoader();
URL url = cl.getResource("users.xml");
xmlRealpath = url.getPath();
}
public static Document getDocument() throws Exception{
SAXReader reader = new SAXReader();
return reader.read(xmlRealpath);
}
public static void write2xml(Document document)throws Exception{
XMLWriter writer = new XMLWriter(new FileOutputStream(xmlRealpath), OutputFormat.createPrettyPrint());
writer.write(document);
writer.close();
}
}
(6)這樣我們的業(yè)務(wù)方法基本完成了。那接下來我們是不是應(yīng)該對(duì)我們的業(yè)務(wù)方法進(jìn)行單元測(cè)試呢,所以理所當(dāng)然的就想到了junit的單元測(cè)試:
package com.zcp.test;
import static org.junit.Assert.*;
import java.util.Date;
import javax.jws.soap.SOAPBinding.Use;
import org.junit.Test;
import com.zcp.domain.User;
import com.zcp.exception.UserHasExistException;
import com.zcp.service.BusinessService;
import com.zcp.service.impl.BusinessServiceImpl;
public class BusinessServiceImplTest {
private BusinessService s = new BusinessServiceImpl();
@Test
public void testRegist() throws UserHasExistException {
User user = new User("zhongchengpeng", "123456","617504296@qq.com", new Date());
s.regist(user);
}
@Test(expected=com.zcp.exception.UserHasExistException.class)
public void testRegist1() throws UserHasExistException {
User user = new User("zhongchengpeng", "123456","617504296@qq.com", new Date());
s.regist(user);
}
@Test
public void testLogin() {
User user = s.login("zhongchengpeng", "123456");
assertNotNull(user);
user = s.login("zhongchengpeng", "123");
assertNull(user);
user = s.login("zcp", "123456");
assertNull(user);
}
}
(7)、到這里我們的業(yè)務(wù)方法就已經(jīng)寫完了。我們就可以很好的使用我們的業(yè)務(wù)接口啦。至于后面的頁(yè)面就明晚繼續(xù)了,好像快12點(diǎn)了,屌絲的我也該睡覺了,明天還得去上班的呢
總結(jié)
以上是生活随笔為你收集整理的java开发模型_java开发模型MVC的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 荣耀 Magic 5 Pro 及至臻版通
- 下一篇: Win10商店上下载的应用连不上网络怎么