04---servlet09(MVC设计模式应用)

使用MVC设计模式完成一个用户登陆程序的开发;

登入程序之前已经学习过,是使用jsp+JDBC完成的开发操作,但是之前的登入程序开发中
	发现有很多的问题,就是一个jsp文件中有scriptlet代码太多,即便是使用jsp+javabean
	的开发模式,其本身也存在jsp中代码过多的问题。

现在就可以利用MVC设计模式来彻底解决掉代码过多的问题;

MVC登陆程序清单:
	页面			文件类型		描述
·	User			JavaBean		用户登陆的VO操作类
·	DatabaseConnection	JavaBean		负责数据库的连接和关闭操作
·	IUserDAO		JavaBean		定义登录操作的DAO接口
·	UserDAOImpl		JavaBean		定义DAO接口的具体实现类
·	UserDAOProxy		JavaBean		定义一个代理
·	DAOFactory		JavaBean		定义一个工厂,得到现实DAO接口的类
·	LoginServlet		Servlet			接受请求,进行验证,调用DAO,返回信息
·	login.jsp		JSP			提供用户登陆表单,

1、数据库创建脚本:
	/*=========启动mysql服务=========*/
	net start mysql
	/*=========打开mysql数据库=========*/
	mysql -uroot	-p123

	/*=========使用lid数据库=========*/
	use lid;
	/*=========删除user数据表========*/
	drop table user;
	/*=========创建user数据表========*/
	create table user(
		userid		varchar(30)				primary key,
		name		varchar(30)				null,
		password	varchar(32)				null
	);
	/*=========插入测试数据========*/
	insert into user(userid,name,password) values('1','lid','123');

2、创建一个VO类;
	package login.lid.vo;
	public class User{
		private String userId;
		private String name;
		private String password;
		
		public void setUserId(String userId){
				this.userId=userId;
			}
		public void setName(String name){
				this.name=name;
			}
		public void setPassword(String password){
				this.password=password;
			}
		public String getUserId(){
				return this.userId;
			}
		public String getName(){
				return this.name;
			}
		public String getPassword(){
				return this.password;
			}
		}
	编译该类,开始否能通过;

2、创建一个dbc的操作类---即数据库的连接关闭类(注意此时一定要不mysql数据驱动的jar包配置到classpath上)
	package login.lid.dbc;
	import java.sql.*;

	public class DatabaseConnection{
			private static final String DBDRIVEDR="org.gjt.mm.mysql.Driver";
			private static final String DBURL="jdbc:mysql://localhost:3306/lid";
			private static final String DBUSERNAME="root";
			private static final String DBPASSWORD="123";
			private Connection conn=null;
			
			public DatabaseConnection() throws Exception{
					Class.forName(DBDRIVEDR);
					conn=DriverManager.getConnection(DBURL,DBUSERNAME,DBPASSWORD);
				}
			//得到数据库的连接
			public Connection getConnection() throws Exception{
					return this.conn;
				}
			//关闭连接
			public void close() throws Exception{
					if(conn!=null){
							conn.close();
						}
				}
		}
	编译该类,开始否能通过;

3、创建DAO接口:---IUserDAO.java
	package login.lid.dao;
	import login.lid.vo.User;

	public interface IUserDAO{
		//现在完成的登陆验证,那么登陆操作只有两种返回结果
		public boolean findLogin(User user) throws Exception;
		}
	编译该类,开始否能通过;

4、创建一个具体实现类:
	package login.lid.dao.impl;
	import java.sql.*;
	import login.lid.vo.User;
	import login.lid.dao.*;

	public class UserDAOImpl implements IUserDAO{
		private Connection conn;
		private PreparedStatement pstmt;
		private ResultSet rs=null;
		
		public UserDAOImpl(Connection conn){
			this.conn=conn;
			} 
		//现在完成的登陆验证,那么登陆操作只有两种返回结果
		public boolean findLogin(User user) throws Exception{
				boolean flag=false;
				String name=user.getName();
				String password=user.getPassword();
				String sql="select userid,name,password from user where name=? and password=?";
				try{
					this.pstmt=conn.prepareStatement(sql);
					this.pstmt.setString(1,name);
					this.pstmt.setString(2,password);
					this.rs=this.pstmt.executeQuery();
					}
				catch(Exception e){
					System.out.println(e);
					}
				if(rs.next()){
					user.setName(rs.getString(2));
					flag=true;
					}
				return flag;
			}
		}
	编译该类,开始否能通过;

5、创建一个代理:
	package login.lid.dao.proxy;
	import java.sql.*;
	import login.lid.dbc.*;
	import login.lid.dao.*;
	import login.lid.dao.impl.*;
	import login.lid.vo.User;


	public class UserDAOProxy implements IUserDAO{
		private DatabaseConnection dbc=null ;
		private IUserDAO dao=null;
		
		public UserDAOProxy(){
			try{
				this.dbc=new DatabaseConnection();
				this.dao=new UserDAOImpl(dbc.getConnection());
				}
			catch(Exception e){
				e.printStackTrace();
				}
				
			} 
		//现在完成的登陆验证,那么登陆操作只有两种返回结果
		public boolean findLogin(User user) throws Exception{
				boolean flag=false;	
				try{				
					flag=this.dao.findLogin(user);			
					}		
				catch(Exception e){
					e.printStackTrace();
					}
				finally{
					dbc.getConnection().close();
					}
				return flag;
			}
		}
	编译该类,开始否能通过;

6、创建工厂:
	package login.lid.factory;
	import login.lid.dao.*;
	import login.lid.dao.proxy.*;

	public class UserDAOFactory{
		private IUserDAO dao=null;
		public UserDAOFactory(){
				this.dao=new UserDAOProxy();
			}
		public IUserDAO getIUserDAOInstance(){
			return this.dao;
			}
		}
	编译该类,开始否能通过;
	以上DAO的操作主要是完成数据层的操作,但是下面在MVC设计模式中,还有servlet也很重要,
	下面建立一个LoginServlet.java的操作类;
7、编写Servlet:
	package login.lid.servlet;
	import java.io.*;
	import java.util.*;
	import javax.servlet.*;
	import javax.servlet.http.*;
	import login.lid.factory.*;
	import login.lid.vo.*;
	public class LoginServlet extends HttpServlet{
		public void doGet(HttpServletRequest req,HttpServletResponse res) throws ServletException,IOException{
			String path="login.jsp";
			String userid=req.getParameter("userid");
			String password=req.getParameter("password");
			//存储错误的信息
			List<String> info=new ArrayList<String>();
			if(userid==null||"".equals(userid)){
				info.add("用户id不能为空");
				}
			if(password==null||"".equals(password)){
				info.add("密码不能为空");
				}
			if(info.size()==0){
				User user=new User();
				user.setName(userid);
				user.setPassword(password);
				UserDAOFactory dao=new UserDAOFactory();
				try{
					if(dao.getIUserDAOInstance().findLogin(user)){
						info.add("用户登陆成功,欢迎"+user.getName()+"光临");
						}
					else{
						info.add("用户登陆失败,错误的用户名和密码");
						}
					}
				catch(Exception e){
					e.printStackTrace();
					}
				}
				if(info!=null){
					System.out.println("=================");
					}
				
				req.setAttribute("info",info);
				req.getRequestDispatcher(path).forward(req,res);
			}
		public void doPost(HttpServletRequest req,HttpServletResponse res) throws ServletException,IOException{
			this.doGet(req,res);
			}
		}
	编译该类,开始否能通过;

8、在web.xml中配置Servlet映射路径:
		<servlet>
	 		<servlet-name>loginservlet</servlet-name>
	 		<servlet-class>login.lid.servlet.LoginServlet</servlet-class>
	 	</servlet>
		<servlet-mapping>
	 		<servlet-name>loginservlet</servlet-name>
	 		<url-pattern>/mvclogin/ServerRedirectDemo</url-pattern>
	 	</servlet-mapping>
9、创建jsp界面:
	<%@ page contentType="text/html" pageEncoding="gbk"%>
	<%@ page import="java.util.*"%>
	<html>
	<head><title>这是测试</title></head>

	<body>
		<script language="javascript">
			function validate(f){
				if(!(/^\w{5,15}$/.test(f.userid.value))){
					alert("用户ID必须是5~15位");
					f.userid.focus();
					return false;
					}
				if(!(/^\w{5,15}$/.test(f.password.value))){
					alert("用户密码必须是5~15位");
					f.password.focus();
					return false;
					}
			}
		</script>
	<%
		request.setCharacterEncoding("gbk");
		List<String> info=(List<String>)request.getAttribute("info");
		if(info!=null){
			Iterator<String> iter=info.iterator();
			while(iter.hasNext()){
	%>
		<h3><font color="red"><%=iter.next()%></font></h3>
	<%
				}
			}
	%>
		<form action="LoginServlet" method="post" onSubmit="return validate(this)">
			用户ID:<input type="text" name="userid"><br>
			密 码:<input type="password" name="password"><br>
			<input type="submit" value="提交">
			<input type="reset" value="重置">
		</form>
	</body>
	</html>
	
	注意在MVC开发中,客户端验证和服务器端验证都需要进行处理;




 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bzuld

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值