web初学之MVC

时间:2023-03-08 21:37:27
web初学之MVC

之前对JavaEE的MVC模式有些许了解,但一直没有很好的掌握,在读代码时候也很模糊不清。因此对MVC又通过各种资料有了全面的理解。

一.首先,需要从了解JavaEE技术开始。JavaEE技术在设计程序时,一般会把程序的结构设计成三层。

●表示层—用户界面和用于生成界面的代码组成。

●中间层—系统的业务和功能代码。

●数据层—完成存储数据库的数据和对数据进行封装。

基于这种程序结构,有了MVC。M即为数据层,包括各种JavaBean以及数据库工具。V即为表示层,通常为Jsp或HTML页面,显示在客户端。C即为中间层,一般为Web层的Servlet组件,由它来处理客户端的各种请求以及数据。

二.MVC的简单应用:

1)Eclipse中的创建项目,项目名chapter11

aaarticlea/png;base64,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" alt="" />

2)模型实体Student

 package com.chapter11.bean;

 import java.sql.Date;

 public class Student {
private int id;
private String name;
private Date birthday;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
} }

JavaBean

3)数据库连接工具JdbcUtil

 package com.chapter11.util;

 import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement; public class JdbcUtil {
static{
try{
Class.forName("com.mysql.jdbc.driver");
}catch(Exception e)
{
e.printStackTrace();
}
}
public static Connection getConnection()
{
Connection con=null;
try{
con=DriverManager.getConnection("jdbc:mysql://localhost:3306/sms","root","hanzhao1024");
}catch(Exception e){
e.printStackTrace();
}
return con;
} public static void release(Connection con,Statement stmt,ResultSet rs)
{
try{
if(rs!=null)
{
rs.close();
} }catch(Exception e)
{
e.printStackTrace();
}
try{
if(stmt!=null)
{
stmt.close();
} }catch(Exception e)
{
e.printStackTrace();
}
try{
if(con!=null)
{
con.close();
} }catch(Exception e)
{
e.printStackTrace();
} }
public static void printRs(ResultSet rs)
{
StringBuffer sb=new StringBuffer();
try{
while(rs.next())
{
sb.append("id="+rs.getInt(1)+"");
sb.append("name="+rs.getString(2)+"\n");
}
System.out.println(sb.toString()); }catch(Exception e)
{
e.printStackTrace();
} } }

JdbcUtil

4)数据访问层接口StudentDao

 package com.chapter11.dao;

 import java.sql.SQLException;
import java.util.List;
import java.sql.SQLException; import com.chapter11.bean.Student; public interface StudentDao {
public void insertStudent(Student stu)throws SQLException;
public List queryAllStudents()throws SQLException; }

StudentDao

5)数据访问层接口实现类StudentDaoImpl

 package com.chapter11.dao;

 import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import com.chapter11.bean.Student;
import com.chapter11.util.JdbcUtil; public class StudentDaoImpl implements StudentDao { Connection con=null;
public StudentDaoImpl(Connection con)
{
this.con=con;
}
PreparedStatement pstmt=null;
ResultSet rs=null;
public void insertStudent(Student stu)throws SQLException
{
String sql="insert into student(name,birthday) value(?,?)";
pstmt=con.prepareStatement(sql);
pstmt.setString(1, stu.getName());
pstmt.setDate(2, stu.getBirthday());
pstmt.executeUpdate();
JdbcUtil.release(null, pstmt, null);
}
public List queryAllStudents()throws SQLException
{
String sql="select*from student";
List students=new ArrayList();
pstmt=con.prepareStatement(sql);
ResultSet rs=pstmt.executeQuery();
while(rs.next())
{
Student stu=new Student();
stu.setId(rs.getInt("id"));
stu.setName(rs.getString("name"));
stu.setBirthday(rs.getDate("birthday"));
students.add(stu);
}
JdbcUtil.release(null, pstmt, null);
return students;
} }

StudentDaoImpl

6)增加和删除的业务服务层接口StudentService

package com.chapter11.service;

import java.sql.SQLException;
import java.util.List; import com.chapter11.bean.Student; public interface StudentService {
public void addStudent(Student stu)throws SQLException;
public List findAllStudent()throws SQLException; }

StudentService

7)增加和删除的业务服务层接口StudentServiceImpl

 package com.chapter11.service;

 import java.sql.Connection;
import java.sql.SQLException;
import java.util.List; import com.chapter11.bean.Student;
import com.chapter11.dao.StudentDao;
import com.chapter11.dao.StudentDaoImpl;
import com.chapter11.util.JdbcUtil; public class StudentServiceImpl implements StudentService{
public void addStudent(Student stu)throws SQLException
{
Connection con=JdbcUtil.getConnection();
try{
con.setAutoCommit(false);
StudentDao sdao=new StudentDaoImpl(con);
sdao.insertStudent(stu);
con.commit(); }catch(Exception e)
{
e.printStackTrace();
} }
public List findAllStudent()throws SQLException {
Connection con=JdbcUtil.getConnection();
List students=null;
try{
con.setAutoCommit(false);
StudentDao sdao=new StudentDaoImpl(con);
sdao.queryAllStudents();
con.commit(); }catch(Exception e)
{
e.printStackTrace();
} return students;
} }

StudentServiceImpl

8)Web层控制器Servlet

package com.chapter11.servlet;

import java.io.IOException;
import java.sql.Date;
import java.util.List; import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
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.chapter11.bean.Student;
import com.chapter11.service.*; @WebServlet("/SMSServletController")
public class SMSServletController extends HttpServlet {
private static final long serialVersionUID = 1L; public SMSServletController() {
super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
} protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
StudentService ss=new StudentServiceImpl();
String path=request.getServletPath();
path=path.substring(0,path.indexOf("."));
if(path.equalsIgnoreCase("/sms/list"))
{
try
{
List students=ss.findAllStudent();
request.setAttribute("students", students);
forward("list.jsp",request,response); }catch(Exception e)
{
throw new ServletException("error when query!");
}
}else if(path.equalsIgnoreCase("/sms/add"))
{
request.setCharacterEncoding("UTF-8");
String name=request.getParameter("name");
String birthday=request.getParameter("birthday");
Student student=new Student();
student.setBirthday(Date.valueOf(birthday));
student.setName(name);
try{
ss.addStudent(student); }catch(Exception e)
{
e.printStackTrace();
}
response.sendRedirect(request.getContextPath()+"/sms/list.do");
} } private void forward(String url, HttpServletRequest request,
HttpServletResponse response)throws IOException,ServletException{
ServletContext application=getServletContext();
RequestDispatcher ds=application.getRequestDispatcher(url);
ds.forward(request,response); } }

Servlet

9)Web层表示页面

整个过程即为一个基本的MVC设计模式以及代码流程。在此还未解决的问题是最后的表示层页面显示,会在此后逐步解决。