林炳文Evankaka原创作品。转载请注明出处http://blog.csdn.net/evankaka
本文要用Servlet+Jsp+MySql实例用户登录,并简要介绍了下MVC的思想,此例子也是按照这个思路来做的。在Eclipse+tomcat7.0上做的。不会很难,对于了解MVC思想很有帮助!
本文工程下载
效果:
这是刚开始的界面
这是错误时的信息
这是成功时的信息
一、MVC简介
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。
控制器
控制器掌管着用户的请求(当用户点击图形用户界面(GUI)上的元素执行操作时,控制器会收到HTTP GET或者POST请求)。它的主要功能就是调用并协调需要的资源/对象来执行用户请求。通常控制器会为任务调用合适的模型,以及选择合适的视图。
模型
模型是指运用于数据之上的数据规则和数据内容,它一般对应于应用程序所要管理的对象。在软件系统中,任何事物都可以被抽象成可以对其以某种方式进行处理的数据模型。应用程序中的用户,信息以及图书是什么?它们只是一堆必须按照对应规则处理的数据(日期不能是未来的日期,电子邮件有特定的格式,名字的长度不能超过多少字符等等。
视图
视图提供了展示模型数据的不同方式。它可能是数据填充的模板。视图可以有多个,而控制器则决定使用哪个视图。一个网络应用通常由许多控制器,模型和视图组成。控制器可以被看成是一个主控制器,用于接收用户的所有请求,然后在调用特定的控制器来处理不同的情况。
二、本文MVC结构
本文的这个例子,比较简单。看看下面的这个图就懂了
三、程序
1、创建数据库,这里使用的是MySql5.6,并插入了一个用户
create database example;
use example;
create table user(
userid int primary key auto_increment,
name varchar(30) NOT NULL,
password varchar(30) NOT NULL
);
insert into user(userid,name,password) values (null,'lin','1234');
如果example不存在,记得要先create database example
select *from user结果如下:
2、VO类,用来和数据库对应,DAO类中会用到的东西
/**
*功能 VO类
*作者 林炳文([email protected] 博客:http://blog.csdn.net/evankaka)
*时间 2015.4.22
*/
package com.mucfc.vo;
public class User {
private int userid;//对应数据库中userid
private String name;//对应数据库中name
private String 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;
}
}
/**
*功能 定义数据库操作类
*作者 林炳文([email protected] 博客:http://blog.csdn.net/evankaka)
*时间 2015.4.22
*/
package com.mucfc.dbc;
import java.sql.Connection;
import java.sql.DriverManager;
public class DatabaseConnection {
//定义数据库驱动程序
private static final String DBDRIVER="com.mysql.jdbc.Driver";
//数据库连接地址
private static final String DBURL="jdbc:mysql://localhost:3306/example";//example表示数据库
private static final String DBUSER="root";
private static final String DBPASS="christmas258@";
private Connection connection=null;
public DatabaseConnection() throws Exception{
try{
//数据库操作可能出现异常
Class.forName(DBDRIVER);
connection=DriverManager.getConnection(DBURL,DBUSER,DBPASS);
}catch(Exception exception ){
throw exception;
} finally {
}
}
public Connection getConnection(){
return connection;
}
public void close() throws Exception{
if(connection!=null){
try {
connection.close();
} catch (Exception e) {
throw e;
}
}
}
}
接口类,查询是否存在这个用户的方法是findLogin(User user)
/**
*功能 定义DAO接口
*作者 林炳文([email protected] 博客:http://blog.csdn.net/evankaka)
*时间 2015.4.22
*/
package com.mucfc.dao;
import com.mucfc.vo.User;
public interface IUserDAO {
/**
* 用户登录验证
* @param user传入vo对象
* @return 验证的操作结果
* @throws Exception
*/
public boolean findLogin(User user) throws Exception;
}
/**
*功能 定义DAO实现类
*作者 林炳文([email protected] 博客:http://blog.csdn.net/evankaka)
*时间 2015.4.22
*/
package com.mucfc.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import com.mucfc.vo.User;
public class UserDAOImpI implements IUserDAO{
private Connection conn=null;//定义数据库连接对象
private PreparedStatement pstmt=null;//定义数据库操作对象
public UserDAOImpI(Connection conn){ //设置数据库连接
this.conn=conn;
}
@Override
public boolean findLogin(User user) throws Exception {
boolean flag=false;
try {
String sql="select name from user where name=? and password=?";
pstmt=conn.prepareStatement(sql);//实例化操作
pstmt.setString(1,user.getName());
pstmt.setString(2, user.getPassword());
ResultSet rSet=pstmt.executeQuery();//取得结果
if(rSet.next()){
user.setName(rSet.getString(1));//取得用户名
flag=true;
}
} catch (Exception e) {
throw e;
}finally{
//关闭操作
if(pstmt!=null){
try {
pstmt.close();
} catch (Exception e) {
throw e;
}
}
}
return flag;
}
}
对用户名和密码进行验证,如果验证成功,则通过VO将用户的真实姓名取出并返回。
6、定义一个DAO的代理类
这里这个代理类可以要也可以不要,这里为了方便些,所以定义了一个
/**
*功能 定义DAO代理类
*作者 林炳文([email protected] 博客:http://blog.csdn.net/evankaka)
*时间 2015.4.22
*/
package com.mucfc.dao.proxy;
import com.mucfc.dao.IUserDAO;
import com.mucfc.dao.UserDAOImpI;
import com.mucfc.dbc.DatabaseConnection;
import com.mucfc.vo.User;
public class UserDAOProxy implements IUserDAO{
private DatabaseConnection dbc=null;//定义数据库连接
private IUserDAO dao=null;//定义DAO接口
public UserDAOProxy(){
try {
dbc=new DatabaseConnection();//实例化数据库连接
} catch (Exception e) {
e.printStackTrace();
}
dao=new UserDAOImpI(dbc.getConnection());
}
@Override
public boolean findLogin(User user) throws Exception {
boolean flag=false;
try {
flag=dao.findLogin(user);//调用真实主题
} catch (Exception e) {
throw e;
}finally{
dbc.close();
}
return flag;
}
}
package com.mucfc.servlet;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.mucfc.dao.proxy.UserDAOProxy;
import com.mucfc.vo.User;
/**
* Servlet implementation class LoginServlet
*/
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public LoginServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name=request.getParameter("name");
String password=request.getParameter("password");
List info=new ArrayList();
if(name==null||"".equals(name)){ //用户名输入格式问题
info.add("用户名不能为空");
System.out.println("用户名不能为空");
}
if(password==null||"".equals(password)){//密码输入格式问题
info.add("密码不能为空");
System.out.println("密码不能为空");
}
if(info.size()==0){
User user=new User();
user.setName(name);
user.setPassword(password);
UserDAOProxy userDAOProxy=new UserDAOProxy();
try {
if(userDAOProxy.findLogin(user)){
info.add("用户登录成功,欢迎"+user.getName()+"光临!");
}else {
info.add("用户登录失败,错误的用户名和密码");
}
} catch (Exception e) {
e.printStackTrace();
}
}
request.setAttribute("info", info);//保存错误信息
request.getRequestDispatcher("Login.jsp").forward(request,response);//跳转
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
它主要实现了得到Login.jsp传过来的name和password,然后调用dao类到数据库example中的user表中去进行name和password的验证。最后再将结果返回给login.jsp,接着login,jsp更新显示结果。
8、初始界面Login.jsp,这里相当是View(显示层)
<%@page import="java.util.Iterator"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=GBK"
pageEncoding="GBK"%>
MVC登录实例
用户登录程序
<%
request.setCharacterEncoding("GBK");
%>
<%
List info=(List)request.getAttribute("info");
if(info!=null){
Iterator iter=info.iterator();
while(iter.hasNext()){
%>
<%=iter.next()%>
<%
}
}
%>
Login.html
Login.htm
Login.jsp
LoginServlet
com.mucfc.servlet.LoginServlet
LoginServlet
/servlet/LoginServlet
11.整个工程目录如下:
12、运行
13、结果
浏览器输入:http://localhost:8080/ServletLearningChapter1_3/
好了,是不是很简单呢?
林炳文Evankaka原创作品。转载请注明出处http://blog.csdn.net/evankaka
本文工程下载