在MVC模型应用中,整个模型内部涉及到三个部分:视图、控制器、模型。 工作原理是 : 用户直接与视图进行交互 , 即用户直接通过网页上的按钮去提交数据 ,而控制器负责接受视图传过来的信息并对模型进行操作 ,根据用户提供的数据更新模型状态,模型状态发生变化后控制器通知视图,视图根据模型的变化进行更新并显示出来。(刚开始学的时候接触到控制器和模型这个概念会很迷,不知道他们具体指的是什么,动手实践一下会促进对概念的理解)
一、前期准备
- 使用工具: 代码编写eclipse(已经配置好了jdk1.8)、本地服务器 Tomcat 9.0 、 数据库软件 sql server 2017
- 在eclipse中 左上角file-new-Dynamic web project, 填写工程名,找到下面的Target runtime,点击右边New runtime ,再找到并选中Apache Tomcat v9.0 ,如果没有,那说明你的软件版本不对,需要下载一些插件,因此建议使用 Eclipse IDE for Java EE Developers 或 MyEclipse 。然后点击finish就完成了 web 工程的创建。
- 在工作区找到自己的工程,在src目录下新建三个package名称如下。
- Com.myapp.controller (放实现控制器的类)
- Com.myapp.model (放模型类)
- Com.myapp.dao (放需要用到的其他类可以是自己写的的类)
我们要做的小工程的功能是实现用户的登录和注册,首先第一个页面应该是一个登录的页面,此前还未学jsp的话,登录页面都是用html编写完成,但是其实jsp和html在编写网页的原理是一样的,二者的组要区别在于jsp可以添加相应的java代码,在MVC模式中,我们用的是jsp编写视图,也就是用户所接触的交互界面,所以说刚开始需要编写一个jsp登录界面 ; 用户在登录界面输入账号密码,点击提交数据登录,这个时候,数据会通过协议传到后台,后台需要对数据进行处理,比如说对比一下数据库中是否有相应的账户信息,如果有,那么就要做出反应,不然用户不知道是登录成功了没,当用户登录成功,在这里用的是一个简单的新页面来显示登录成功。所以说这里就要编写 一个检验并处理登录信息控制器类、一个用户登录成功的jsp登录成功界面。当然,倘若是新用户的话,就需要在注册一个用户信息,然后导入到数据库里面。因此这里需要一个注册用户信息界面,一个处理用户登录信息的控制器类,在这里因为比较简单所以可以将处理登录信息和处理注册信息的控制都写在一个类里面。(暂时忽略那种老用户但是输入账户密码错误的情况,凡是只要对不上数据库数据就跳转到注册页面,因为我们探讨的主要是MVC模式 ^_^ )
下面是我的项目下的一些包和类在 src目录下,以及需要导入的连接使用数据库用到的包sqljdbc42.jar在Referenced Libraries下,还有需要用到的三个jsp页面在WebContent目录下。顺便看一下演示效果。
这个类呢 ,准确来说算是一个辅助类,当使用这个类创建对象的时候,就默认有了数据库中需要存的一些属性,你可以对此类的对象的各变量进行赋值,创建这个类的理由是,我们不用在 每次需要注册新用户的时候都创建建变量进行赋值,这样会比较麻烦,而有了这个类的话直接创建对象再调用方法便可以暂时存取数据。
//Com.myapp.model.UserMOdel
package Com.myapp.model;
public class UserModel {
int id;
String username;
String password;
String email;
String gender;
String date;
public int Getid() {
return id;
}
public String Getusername() {
return this.username;
}
public String Getpassword() {
return this.password;
}
public String Getemail() {
return this.email;
}
public String Getgender() {
return this.gender;
}
public String Getdate() {
return this.date;
}
public void Setid(int id_1){
id=id_1;
}
public void Setusername(String username_1){
username=username_1;
}
public void Setemail(String email_1){
email=email_1;
}
public void Setpassword(String Setpassword_1){
password=Setpassword_1;
}
public void Setgender(String gender_1){
gender=gender_1;
}
public void Setdate(String date_1){
date=date_1;
}
}
这个类是对数据库进行操作的类,拥有两个方法 ,返回类型都是布尔类型,只需要把外面连接好的数据库Connection对象,和已经插入了数据的UserModel 类对象作为参数,调用这两个方法,第一可以实现验证前台表单传来的数据是否在数据库中存在,第二是在数据库中存入注册用户的信息是否成功。
//Com.myapp.dao.UserDao.java
package Com.myapp.dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import Com.myapp.model.UserModel;
public class UserDao {
public boolean validateUser(Connection dbConn, UserModel model) throws ClassNotFoundException, SQLException {
Statement stmt=dbConn.createStatement();
String select="select username,password,email,agend,date from usertable where username=\'"+model.Getusername()+"\'and password=\'"+model.Getpassword()+"\'";
ResultSet rs=stmt.executeQuery(select);
if(rs.next()) {
return true;
}
else
return false;
}
public boolean insertUser(Connection dbConn, UserModel model) throws SQLException {
String insert="insert into usertable values(?,?,?,?,?)";
PreparedStatement stmt=dbConn.prepareStatement(insert);
stmt.setString(1,model.Getusername());
stmt.setString(2,model.Getpassword());
stmt.setString(3,model.Getemail());
stmt.setString(4,model.Getgender());
stmt.setString(5,model.Getdate());
stmt.executeUpdate();
System.out.println("插入成功!");
return true;
}
}
控制类:根据jsp页面传来的表单,首先连接数据库,再判断是注册还是登录表单信息,如果是登陆表单传来的,假如该登录信息在数据库中存在就直接跳转到Welcome页面,要是不存在就跳转到注册信息的页面。注册完成之后,会自动跳转到登录页面。
// Com.myapp.controller.UserControllerServlet
package Com.myapp.controller;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import Com.myapp.dao.UserDao;
import Com.myapp.model.UserModel;
@WebServlet("/UserControllerServlet")
public class UserControllerServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
String dbURL = "jdbc:sqlserver://localhost:1433;DatabaseName=userdb"; /数据的路径
Connection dbConn=null;
public UserControllerServlet() {
super();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");//设置后台跟前面浏览器数据中不乱码
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
System.out.println("加载驱动成功");
} catch (ClassNotFoundException e1) {
// TODO Auto-generated catch block
System.out.println("加载驱动失败");
e1.printStackTrace();
}
try {
dbConn = DriverManager.getConnection(dbURL,"sa","123456");
System.out.println("连接数据库成功");
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
System.out.println("数据库连接失败");
}
String action=request.getParameter("action");
if(action.equals("login")) {
String username=request.getParameter("username");
String password=request.getParameter("password");
UserModel model=new UserModel();
model.Setusername(username);
model.Setpassword(password);
UserDao dao=new UserDao();
try {
if(dao.validateUser(dbConn,model))
{
RequestDispatcher rd=request.getRequestDispatcher("welcome.jsp");
rd.forward(request, response);
}
else
{
RequestDispatcher rd=request.getRequestDispatcher("userregister.jsp");
rd.forward(request, response);
}
} catch (ClassNotFoundException | SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
else if(action.equals("register"))
{
String username=request.getParameter("username");
String password=request.getParameter("password");
String email=request.getParameter("email");
String agend=request.getParameter("gender");
String date=request.getParameter("data");
UserModel model=new UserModel();
model.Setusername(username);
model.Setpassword(password);
model.Setemail(email);
model.Setgender(agend);
model.Setgender(date);
UserDao Dao=new UserDao();
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
} catch (ClassNotFoundException e1) {
// TODO Auto-generated catch block
System.out.println("加载驱动失败");
e1.printStackTrace();
}
try {
dbConn = DriverManager.getConnection(dbURL,"sa","123456");
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
System.out.println("数据库连接成功");
}
try {
Dao.insertUser(dbConn,model);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("插入失败")
;
}
PrintWriter out=response.getWriter();
out.print("注册信息成功! "+"三秒后自动跳转到登陆页面");
response.setHeader("refresh","3;login.jsp");
}
}
}
接下来是三个jsp页面代码:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
Welcome to
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here