MVC(Model -View-Controller)实例应用模式

时间:2024-12-19 08:06:31

MVC(Model -View-Controller)实例应用模式

以登录为例:

Model:User

  1. package com.keith.bean;
  2. public class TUser implements java.io.Serializable {
  3. private static final long serialVersionUID = 1L;
  4. private Integer userid;
  5. private String userName;
  6. private String pwd;
  7. public TUser() {
  8. }
  9. public Integer getUserid() {
  10. return userid;
  11. }
  12. public void setUserid(Integer userid) {
  13. this.userid = userid;
  14. }
  15. public String getUserName() {
  16. return userName;
  17. }
  18. public void setUserName(String userName) {
  19. this.userName = userName;
  20. }
  21. public String getPwd() {
  22. return pwd;
  23. }
  24. public void setPwd(String pwd) {
  25. this.pwd = pwd;
  26. }
  27. }

 

 

 

 

数据库连接类:

  1. package com.keith.util;
  2. import java.sql.Connection;
  3. import java.sql.DriverManager;
  4. import java.sql.SQLException;
  5. public class DBConn {
  6. private static final String DBDRIVER = "com.mysql.jdbc.Driver";
  7. private static final String DBURL = "jdbc:mysql://127.0.0.1:3306/login";
  8. private static final String DBUSER = "root";
  9. private static final String DBPWD = "kejianjun";
  10. private Connection conn = null;
  11. public DBConn() {
  12. try {
  13. Class.forName(DBDRIVER);
  14. conn = DriverManager.getConnection(DBURL, DBUSER, DBPWD);
  15. catch (ClassNotFoundException e) {
  16. e.printStackTrace();
  17. catch (SQLException e) {
  18. e.printStackTrace();
  19. }
  20. }
  21. public void close() throws Exception{
  22. if (this.conn != null) {
  23. try {
  24. conn.close();
  25. catch (Exception e) {
  26. e.printStackTrace();
  27. }
  28. }
  29. }
  30. public Connection getConn() {
  31. return conn;
  32. }
  33. public void setConn(Connection conn) {
  34. this.conn = conn;
  35. }
  36. }

 

View层:登录jsp页面

  1. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
  2. <%
  3. String path = request.getContextPath();
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
  5. %>
  6. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  7. <html>
  8. <head>
  9. <base href="<%=basePath%>">
  10. <title>My JSP 'index.jsp' starting page</title>
  11. <meta http-equiv="pragma" content="no-cache">
  12. <meta http-equiv="cache-control" content="no-cache">
  13. <meta http-equiv="expires" content="0">
  14. <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
  15. <meta http-equiv="description" content="This is my page">
  16. <!--
  17. <link rel="stylesheet" type="text/css" href="styles.css">
  18. -->
  19. <script type="text/javascript">
  20. function validate(f){
  21. if (!(/^\w{4,15}$/.test(f.username.value))) {
  22. alert("用户名必须是4~16位!");
  23. f.username.focus();
  24. return false;
  25. }
  26. if (!(/^\w{4,15}$/.test(f.pwd.value))) {
  27. alert("密码必须是4~15位!");
  28. f.pwd.focus();
  29. return false;
  30. }
  31. return true;
  32. }
  33. </script>
  34. </head>
  35. <body>
  36. <%
  37. List<String> info = (List<String>)request.getAttribute("info");
  38. if(info != null){
  39. Iterator<String> iter = info.iterator();
  40. while(iter.hasNext()){
  41. %>
  42. <h3><font color="red"><%=iter.next() %></font></h3>
  43. <%}
  44. } %>
  45. <form action="login" method="post" onsubmit="return validate(this)" name="f">
  46. 用户名:<input type="text" name="username"><br />
  47. 密&nbsp;码:<input type="password" name="pwd"><br />
  48. <input type="submit" value="登陆">&nbsp;&nbsp;&nbsp;
  49. <input type="reset" value="取消">
  50. </form>
  51. </body>
  52. </html>

配置web.xml

  1. <servlet>
  2. <servlet-name>login</servlet-name>
  3. <servlet-class>com.keith.servlet.LoginServlet</servlet-class>
  4. </servlet>
  5. <servlet-mapping>
  6. <servlet-name>login</servlet-name>
  7. <url-pattern>/login</url-pattern>
  8. </servlet-mapping>
  9. <servlet>

Controller控制层  servlet

  1. package com.keith.servlet;
  2. import java.io.IOException;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. import javax.servlet.ServletException;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. import com.keith.bean.TUser;
  10. import com.keith.factory.DAOFactory;
  11. /**
  12. * 定义Sevlet
  13. *
  14. * @author T
  15. *
  16. */
  17. public class LoginServlet extends HttpServlet {
  18. private static final long serialVersionUID = 1L;
  19. @Override
  20. protected void doGet(HttpServletRequest req, HttpServletResponse resp)
  21. throws ServletException, IOException {
  22. this.doPost(req, resp);
  23. }
  24. @Override
  25. protected void doPost(HttpServletRequest req, HttpServletResponse resp)
  26. throws ServletException, IOException {
  27. String sucPath = "main.jsp";
  28. String loginEroPath = "index.jsp";
  29. String username = req.getParameter("username");
  30. String pwd = req.getParameter("pwd");
  31. List<String> info = new ArrayList<String>();
  32. if (username == null || "".equals(username)) {
  33. info.add("用户名不能为空!");
  34. }
  35. if (pwd == null || "".equals(pwd)) {
  36. info.add("密码不能为空!");
  37. }
  38. //用户名密码通过验证
  39. if (info.size() == 0) {
  40. //实例化VO
  41. TUser user = new TUser();
  42. //设置username
  43. user.setUserName(username);
  44. //设置pwd
  45. user.setPwd(pwd);
  46. if (DAOFactory.getIUserDAOInstance().findLogin(user)) {
  47. info.add("欢迎:" + user.getUserName());
  48. //保存信息,进行跳转
  49. req.setAttribute("info", info);
  50. req.getRequestDispatcher(sucPath).forward(req, resp);
  51. else {
  52. info.add("用户信息错误!");
  53. req.setAttribute("info", info);
  54. req.getRequestDispatcher(loginEroPath).forward(req, resp);
  55. }
  56. }
  57. }
  58. }

通过DAO工厂找到UserDAO的实例:这是DAOFactory

  1. package com.keith.factory;
  2. import com.keith.dao.IUserDAO;
  3. import com.keith.dao.proxy.UserDAOProxy;
  4. /**
  5. * 定义工厂类,取得DAO实例
  6. * @author T
  7. *
  8. */
  9. public class DAOFactory {
  10. /**
  11. * 取得DAO实例
  12. * @return
  13. */
  14. public static IUserDAO getIUserDAOInstance(){
  15. //返回代理实例
  16. return new UserDAOProxy();
  17. }
  18. }

返回代理实例,找到userDAO的代理类:

Java代码  

  1. package com.keith.dao.proxy;
  2. import com.keith.bean.TUser;
  3. import com.keith.dao.IUserDAO;
  4. import com.keith.dao.UserDAOImpl;
  5. import com.keith.util.DBConn;
  6. /**
  7. * DAO代理操作类
  8. *
  9. * @author T
  10. *
  11. */
  12. public class UserDAOProxy implements IUserDAO {
  13. private DBConn dbc = null;
  14. private IUserDAO dao = null;
  15. public UserDAOProxy() {
  16. //实例化数据库连接
  17. this.dbc = new DBConn();
  18. this.dao = new UserDAOImpl(this.dbc.getConn());
  19. }
  20. /**
  21. * 代理登陆方法
  22. */
  23. public boolean findLogin(TUser user) {
  24. boolean flag = false;
  25. try {
  26. // 调用真实主题
  27. flag = this.dao.findLogin(user);
  28. this.dbc.close();
  29. catch (Exception e) {
  30. e.printStackTrace();
  31. }
  32. return flag;
  33. }
  34. }

找到UserDAOImpl的并执行它的findLogin()方法:

Java代码  

  1. package com.keith.dao;
  2. import java.sql.Connection;
  3. import java.sql.PreparedStatement;
  4. import java.sql.ResultSet;
  5. import java.sql.SQLException;
  6. import com.keith.bean.TUser;
  7. public class UserDAOImpl implements IUserDAO {
  8. private Connection conn = null;
  9. private PreparedStatement pstm = null;
  10. public UserDAOImpl(Connection conn) {
  11. this.conn = conn;
  12. }
  13. /**
  14. * 登陆
  15. *
  16. * @throws SQLException
  17. */
  18. public boolean findLogin(TUser user) {
  19. boolean flag = false;
  20. try {
  21. String sql = "SELECT username,pwd FROM tuser WHERE username=? and pwd=?";
  22. this.pstm = this.conn.prepareStatement(sql);
  23. this.pstm.setString(1, user.getUserName());
  24. this.pstm.setString(2, user.getPwd());
  25. ResultSet rs = this.pstm.executeQuery();
  26. if (rs.next()) {
  27. user.setUserName(rs.getString(1));
  28. flag = true;
  29. }
  30. catch (SQLException e) {
  31. e.printStackTrace();
  32. finally {
  33. try {
  34. if (this.pstm != null) {
  35. this.pstm.close();
  36. }
  37. catch (SQLException e2) {
  38. e2.printStackTrace();
  39. }
  40. }
  41. return flag;
  42. }
  43. }

 实现了IUserDAO接口:

Java代码  

  1. package com.keith.dao;
  2. import java.sql.SQLException;
  3. import com.keith.bean.TUser;
  4. /**
  5. * userDao接口
  6. *
  7. * @author T
  8. *
  9. */
  10. public interface IUserDAO {
  11. /**
  12. * 用户登录验证
  13. *
  14. * @param user
  15. * @return
  16. */
  17. public boolean findLogin(TUser user);
  18. }