我们以登录为例,讲解MVC
模式的运用
<p:colorscheme colors="#ffffff,#000000,#808080,#000000,#bbe0e3,#333399,#009999,#99cc00"> </p:colorscheme>
•文字说明
客户进入登陆界面(视图),利用用户名和密码来登录系统,跳转到Servlet(控制器),通过Servlet传递参数来JavaBean(模型),JavaBean通过验证后,采取跳转不同的界面,即没有查询到数据,则显示登录失败的页面(视图)。否则通过权限值的不同跳转到不同的权限界面(视图)。
分析设计
<p:colorscheme colors="#ffffff,#000000,#808080,#000000,#bbe0e3,#333399,#009999,#99cc00">
- 1.数据库设计
- 2.MVC模式的分离
- 设计模式的选用
- 6.通过不同的异常和属性值控制导向不同的方向(策略模式)
<p:colorscheme colors="#ffffff,#000000,#808080,#000000,#bbe0e3,#333399,#009999,#99cc00"></p:colorscheme>
数据库设计
数据库名:company
表名:user
user的字段:
username:varchar(20) primary key
password:varchar(20)
priority:int default 0 //优先级的最低为0
MVC模式的分离
控制器:com.eimhe.controler.LoginAction
模型:com.eimhe.model.User
com.eimhe.model.Query
com.eimhe.model.QueryBeanFactory
com,eimhe.model.ConnectionPool
视图:errors.jsp
login.jsp
nonresult.jsp
welcome.jsp
welcomeadmin.jsp
welcomemanage.jsp
为不同的服务设计设计接口(接口模式)
主要的设计业务方法:query(:HttpServletRequest):User
接口:
java 代码
- package com.eimhe.model;
-
- import java.sql.SQLException;
-
- import javax.servlet.http.HttpServletRequest;
-
- import com.eimhe.exception.FieldLengthException;
-
- public interface Query {
- public User query(HttpServletRequest request)throws SQLException,FieldLengthException;
- }
其中
FieldLengthException的声明:
java 代码
- package com.eimhe.exception;
-
- public class FieldLengthException extends Exception {
- public FieldLengthException(String message)
- {
- super(message);
- }
- }
共享数据库链接池(享元模式)
类名:com.eimhe.model.ConnectionPool
方法:public static Connection getConnection() throws SQLException;
代码:
java 代码
- package com.eimhe.model;
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.SQLException;
-
- public class ConnectionPool {
- public static Connection getConnection()throws SQLException
- {
- try
- {
- Class.forName("com.mysql.jdbc.Driver");
- return DriverManager.getConnection("jdbc:mysql://localhost:3306/company","root","123456");
- }catch(ClassNotFoundException e)
- {
- System.err.println(e);
- }
- throw new SQLException();
-
- }
- }
产生抽象类型的对象(工厂模式)
利用工厂方法来实例化抽象对象,我们采取内置类的方式来实现接口对象
public class QueryBeanFactory {
public static Query createQuery()
{
return new Query()
{
…….
};
}
}
实现代码:
java 代码
- package com.eimhe.model;
-
- import java.sql.CallableStatement;
- import java.sql.Connection;
- import java.sql.ResultSet;
- import java.sql.SQLException;
-
- import javax.servlet.http.HttpServletRequest;
-
- import com.eimhe.exception.FieldLengthException;
-
- public class QueryBeanFactory {
- public static Query createQuery()
- {
- return new Query()
- {
- private Connection con;
- private CallableStatement call;
- private ResultSet resultSet;
- public User query(HttpServletRequest request)throws SQLException,FieldLengthException
- {
-
- con=ConnectionPool.getConnection();
- call=con.prepareCall("");
- resultSet=call.executeQuery();
- User user=new User();
- String username=request.getParameter("username");
- String password=request.getParameter("password");
- int uLen=username.length();
- int pLen=password.length();
- if(uLen==0 || uLen>20 || pLen==0 || pLen>20)
- {
- throw new FieldLengthException("Fields' length is error!");
- }
- if(!resultSet.next())
- {
- throw new SQLException("Sorry!query: non result!");
- }
- user.setUsername(username);
- user.setPassword(password);
- user.setPriority(resultSet.getInt("priority"));
- return user;
- }
- };
- }
- }
<p:colorscheme colors="#ffffff,#000000,#808080,#000000,#bbe0e3,#333399,#009999,#99cc00"> </p:colorscheme>
JDBC中的桥接模式
JDBC通过方法桥接对象:
DriverManager.getConnection() -> Connection.prepareCall()->CallableStatement.executeQuery()->ResultSet
产生特定的Bean(生成器模式)
我们这里通过是用户名和密码的验证的方式来产生User对象,通过实现Query接口的query方法来实现User对象的生成。
通过不同的异常和属性值控制导向不同的方向
若验证成功的话,通过优先数的高低定向到不同的页面。
若验证有问题的话,没有结果的,抛出一个SQLException的异常,并传递信息。若是字符长度不符合的话,那么也会抛出一个FieldLengthException的异常。同样是说不同的异常有不同的页面给出!
LoginAction(控制器):
java 代码
- package com.eimhe.controler;
-
- import java.io.IOException;
- import java.sql.SQLException;
-
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
-
- import com.eimhe.exception.FieldLengthException;
- import com.eimhe.model.Query;
- import com.eimhe.model.QueryBeanFactory;
- import com.eimhe.model.User;
-
- public class LoginAction extends HttpServlet {
-
-
-
-
- public LoginAction() {
- super();
- }
-
-
-
-
- public void destroy() {
- super.destroy();
-
- }
-
-
-
-
-
-
-
-
-
-
-
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
-
- doPost(request,response);
- }
-
-
-
-
-
-
-
-
-
-
-
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- Query queryBean=QueryBeanFactory.createQuery();
- try
- {
- User user=queryBean.query(request);
- if(user.getPriority()==2)
- {
- response.sendRedirect("./welcomeadmin.jsp");
- return;
- }
- else if(user.getPriority()==1)
- {
- response.sendRedirect("./welcomemanager.jsp");
- return;
- }
- response.sendRedirect("./welcome.jsp");
- }catch(FieldLengthException e)
- {
- System.err.println(e);
- response.sendRedirect("./nonresult.jsp");
- }catch(SQLException e)
- {
- System.err.println(e);
- response.sendRedirect("./nonresult.jsp");
- }
-
- }
-
-
-
-
-
-
- public void init() throws ServletException {
-
- }
-
- }