MVC五层练习——好友录(二)
MVC五层架构之好友录
前言
提示:我使用的是eclipse开发环境,但一定要搭建好tomcat服务器,同时本实验需要具备JDBC的知识。
提示:以下是本篇文章正文内容,下面案例可供参考
一、准备
主要实现登录、注册、查询好友、删除、修改、添加好友信息,看起来还是十分简单的,但目的是希望可以通过这个了解MVC五层框架
1.1 数据准备
我们只需要两个表,一个是用户表,一个是好友表,具体代码我放在下面,我用的是mysql的。
用户表
CREATE TABLE `user` (
`userid` int(2) NOT NULL AUTO_INCREMENT,
`name` varchar(12) NOT NULL,
`password` varchar(12) NOT NULL,
PRIMARY KEY (`userid`)
)
好友表
CREATE TABLE `myfriend` (
`id` int(5) NOT NULL AUTO_INCREMENT,
`userid` int(2) NOT NULL,
`name` varchar(10) NOT NULL,
`sex` varchar(2) DEFAULT NULL,
`age` tinyint(2) DEFAULT NULL,
`qq` varchar(20) DEFAULT NULL,
`telephone` varchar(20) DEFAULT NULL,
`email` varchar(20) DEFAULT NULL,
`address` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `friend_fk_userid` (`userid`),
CONSTRAINT `friend_fk_userid` FOREIGN KEY (`userid`) REFERENCES `user` (`userid`)
)
数据样例自行编入,也可以看我发的资源friends.zip自行下载,里面有数据sql代码:
注意:需要mysql的一个jar包,我会放在资源中,大家也可以自行下载,记得学习如何导入
1.2 tomcat搭建
转载:Eclipse环境下如何配置Tomcat,并且把项目部署到Tomcat服务器上
1.3 项目部署图
项目整体部署图
二、编写所有vo类、util类
1.vo类
VO(Value Object)对象:在各层之间传递数据时,用VO对象将数据进行封装。如果传递的VO对象为集合,需要将它们进一步封装到LinkedList、HashSet等集合类对象中。
Friend类:
public class Friend {
private int id;
private int userid;
private String name;
private String sex;
private int age;
private String qq;
private String telephone;
private String email;
private String address;
public Friend() {}
public Friend(int id, int userid, String name, String sex, int age, String qq, String telephone, String email,
String address) {
super();
this.id = id;
this.userid = userid;
this.name = name;
this.sex = sex;
this.age = age;
this.qq = qq;
this.telephone = telephone;
this.email = email;
this.address = address;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getUserid() {
return userid;
}
public void setUserid(int userid) {
this.userid = userid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getQq() {
return qq;
}
public void setQq(String qq) {
this.qq = qq;
}
public String getTelephone() {
return telephone;
}
public void setTelephone(String telephone) {
this.telephone = telephone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return name + " " + sex + " " + email;
}
}
User类:
public class User {
private int userid;
private String name;
private String password;
public User() {}
public User(int userid,String name,String password) {
this.userid = userid;
this.name = name;
this.password = password;
}
public int getUserid() {
return userid;
}
public void setUserid(int userid) {
this.userid = userid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
1.2 util类
持久化层:在数据库或文件中存储数据。如果采用数据库,一般为上层提供连接池。
编写简单工厂ObjectFactory类,主要用于生成各种对象
public class ObjectFactory {
public static dao.BaseDAO createDaoObject(String entityName){
entityName= entityName.toLowerCase();
if(entityName.equals("userdao"))
return new UserDao();
else if(entityName.equals("frienddao"))
return new FriendDao();
else {
return null;
}
}
public static UserModel createUserModel(){
return new UserModelClass();
}
public static FriendModel createFriendModel(){
return new FriendModelClass();
}
public static User createUser() {
return new User();
}
public static Friend createFriend() {
return new Friend();
}
}
数据库连接池
public class DButil {
private static String driver;
private static String url;
private static String user;
private static String password;
private static final int POOL_SIZE =10;
private List<Connection> cons;
private static DButil db;
static{
InputStream is = DButil.class.getClassLoader().getResourceAsStream("db.properties");
Properties props = new Properties();
try {
props.load(is);
driver= props.getProperty("jdbc.driver");
url = props.getProperty("jdbc.url");
user = props.getProperty("jdbc.user");
password = props.getProperty("jdbc.password");
System.out.println(props.size());
} catch (IOException e) {
e.printStackTrace();
}
}
public static DButil getInstance() {
if(db==null) {
db = new DButil();
}
return db;
}
private DButil() {
cons = new LinkedList<Connection>();
try {
Class.forName(driver);
for(int i=0;i<POOL_SIZE;i++) {
Connection con = DriverManager.getConnection(url, user, password);
cons.add(con);
}
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
}
public Connection getConnection() {
if(cons.size()==0) {
}
return cons.remove(0);
}
public void release(Connection connection) {
cons.add(connection);
}
}
注意:使用数据库连接池记得部署配置文件:db.properties,在src包下创建一个文件,命名db.properties,文件内容如下:
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/连接的数据库名?serverTimeZone=UTC
jdbc.user=账号
jdbc.password=密码
2.Filter
- Filter 主要用于对请求(Request)进行预处理,也可以对响应(Response)进行后处理。
- 利用Filter可以实现判断登录与否、编码转换、文字过滤、日志处理、内容加解密、统计访问量等诸多功能。
CharacterEncodingFilter:编码转码转换
@WebFilter("/*")
public class CharacterEncodingFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding("gbk");
response.setCharacterEncoding("gbk");
chain.doFilter(request, response);
}
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
}
SignOnFilter:利用Filter的集中处理,判断是否登陆后请求页面或servlet。
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@WebFilter("/*")
public class SignOnFilter implements Filter {
public void destroy() {
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest hreq=(HttpServletRequest) request;
HttpServletResponse hres=(HttpServletResponse) response;
HttpSession session = hreq.getSession();
//用户已经登陆,正常处理请求链内容
if(session.getAttribute("user")!=null)
chain.doFilter(request, response);
//请求地址为登陆表单和登陆验证页面,同样正常处理请求链内容
else if(hreq.getRequestURI().indexOf("loginForm.jsp")>=0 ||
( hreq.getContextPath()+"/login").equals(hreq.getRequestURI())
|| hreq.getRequestURI().indexOf("registerForm.jsp")>=0 ||
( hreq.getContextPath()+"/register").equals(hreq.getRequestURI())) {
chain.doFilter(request, response);
}
//请求非法,一律转向登陆表单页面
else {
hres.sendRedirect("loginForm.jsp");
}
}
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
}
}
总结
部署特别重要,不同包下的类有着不同的功能,他们之间分工十分明确,思路很清晰。