MVC案例
首先我们回顾一下MVC的执行过程:
MVC设计模式的模块组成是由:模型、视图和控制器组成。其中
模型:代表应用程序状态和业务逻辑。
视图:提供可交互的客户的界面,向客户显示模型数据。
控制器:根据客户的请求来操纵模型,并把结果经由视图展现给客户。
而MVC的工作模式如下图所示:
其中控制器Controller也就是Servlet。
我们回顾了之前所学的MVC的执行过程后,想必是对MVC的功能是了解清楚了。那我们言归正传,做个小案例来测试一下。(此次的案例将会用到JavaBean和Servlet的知识。)
首先,我们先写出登录页,并给用户名和密码赋予name值,method你可以使用get提交方式,也可使用post提交方式,在此我就用post提交方式来演示,而action则是用的:/你所创建的项目名称/你所创建Servlet的名称:
<form action="/MvcProject/loginServlet" method="post">
用户名:<input type="text" name="uname"><br>
密码:<input type="password" name="upwd"><br>
<input type="submit" value="登录">
</form>
其次,我们创建loginServlet,“Login login = new Login(uname,upwd)与 int result = LoginDao.login(login)“则是把用户名和密码封装成一个实体类(JavaBean)。[封装业务逻辑的模型对应一个功能,封装数据JavaBean(实体类)对应一张表(数据库的表)]
loginServlet:
//解决中文乱码
request.setCharacterEncoding("UTF-8");
/**
*response.setCharacterEncoding("UTF-8");
*response.setContentType("text/html;charset=UTF-8");
*此二者写其一即可
**/
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
//处理登录,获取表单数据
String uname = request.getParameter("uname");
String upwd = request.getParameter("upwd");
Login login = new Login(uname,upwd);
//调用模型层的登录功能
int result = LoginDao.login(login);
if (result > 0) {
response.sendRedirect("index.jsp");
}else{
response.sendRedirect("login.jsp");
}
LoginDao:
//模型层,用于处理登录操作(访问数据库,查询数据)
public static int login(Login login){
// 连接数据库
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
//指定数据指针,limit为0时也不能执行
int result = -1;
/**
* -1:系统异常
* 0:用户名或密码有误
* 1:登录成功
*/
int flag = -1;
try {
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/user?characterEncoding=utf8&useSSL=false&serverTiemzone=UTC", "root", "123456");
String sql = "select * from user where username = ? and userpass = ?";
pstmt = con.prepareStatement(sql);
pstmt.setString(1,login.getUsername());
pstmt.setString(2,login.getUserpass());
rs = pstmt.executeQuery();
if (rs.next()){
//拿到数据库中的第一条数据,相当于limit 1;
result = rs.getInt(1);
}
//登录成功
if (result > 0){
return 1;
} else {
return 0;
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
/**
* 此时的登录失败是系统异常所导致的登录失败
* 所以登录失败分为两种,一种为用户名或密码错误;
* 另外一种则为之系统异常。
*/
return -1;
} catch (SQLException throwables) {
throwables.printStackTrace();
return -1;
} finally {
// 关闭数据库连接对象
try {
if(rs != null) {
rs.close();
}
if(pstmt != null) {
pstmt.close();
}
if(con != null) {
con.close();
}
}catch (Exception e) {
System.out.println("JDBC-Close Error!");
}
}
}
Login:
private int id;
private String username;
private String userpass;
//无参构造
public Login() {
}
//因id不用手动添加,故不用写id
public Login(String username, String userpass) {
this.username = username;
this.userpass = userpass;
}
//有参构造
public Login(int id, String username, String userpass) {
this.id = id;
this.username = username;
this.userpass = userpass;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getUserpass() {
return userpass;
}
public void setUserpass(String userpass) {
this.userpass = userpass;
}
最终执行过程如下图所示: