MVC模式在Java Web应用程序中的实例分析

一个简单的MVC实例

利用jsp+javabean+Servlet模拟一个用户登陆,实现对数据库的增删改查。

1,创建数据库

我使用的数据库是MySQL,创建一个Iuser表,具体如下

 

2,创建一个javabean类,对表中的3个属性进行封装

User.Java

 

package cn.jw.vo;

 

public class User {

private String username;

private String userspass;

private String userid;

public User(){

 

}

public String getUsername() {

return username;

}

public void setUsername(String username) {

this.username = username;

}

public String getUserspass() {

return userspass;

}

public void setUserspass(String userspass) {

this.userspass = userspass;

}

public String getUserid() {

return userid;

}

public void setUserid(String userid) {

this.userid = userid;

}

}

3,创建一个名为DataBaseConnection.java的类,实现数据库的驱动

DataBaseConnection.java

package cn.jw.dbc;

 

import java.sql.*;

 

public class DataBaseConnection {

public static final String DBDRIVER="com.mysql.jdbc.Driver";

    public static final String DBURL="jdbc:mysql://localhost:3306/test";

    public static final String DBUSER="root";

    public static final String DBPASS="zhy1121";

private Connection conn=null;

public DataBaseConnection(){

try {

Class.forName(DBDRIVER);

this.conn=DriverManager.getConnection(DBURL,DBUSER,DBPASS);

} catch (ClassNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

    public Connection getConnection() {

// TODO Auto-generated method stub

return this.conn;

}

    public void close() {

// TODO Auto-generated method stub

        try {

this.conn.close();

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

4,创建一个dao接口,并创建一个实现类和一个代理类,继承这个接口

接口用来定义一些方法,在下面会用到

UserDao.java

package cn.jw.dao;

 

import java.util.List;

 

import cn.jw.vo.User;

 

 

public interface UserDAO {

 

}

UserDaoImpl.java

public class UserDaoImpl implements UserDAO {

 

private Connection conn=null;

private PreparedStatement pstmt=null;

private int count=0;

 

public UserDaoImpl(Connection conn1){

    this.conn=conn1;

 }

}

UserDaoPoxy.java

package cn.jw.dao.poxy;

 

import java.util.ArrayList;

import java.util.List;

 

import cn.jw.dao.UserDAO;

import cn.jw.dao.impl.UserDaoImpl;

import cn.jw.dbc.DataBaseConnection;

import cn.jw.vo.User;

 

public class UserDaoPoxy implements UserDAO {

private DataBaseConnection dbc = null;

private UserDAO dao = null;

public UserDaoPoxy(){

this.dbc = new DataBaseConnection();

this.dao = new UserDaoImpl(this.dbc.getConnection());

}

}

具体的实现方法根据功能再添加。

5,创建一个工厂类

DaoFactory.java

package cn.jw.factory;

 

import cn.jw.dao.UserDAO;

import cn.jw.dao.poxy.UserDaoPoxy;

 

public class DaoFactory {

public static UserDAO getUserDaoInstance() throws Exception{

return new UserDaoPoxy();

}

 

}

6,实现第一个功能,用户登陆

(1)新建一个名为Login.jsp的jsp文件,来实现用户登录界面

 <form action="LoginServlet" method="post"

    用户ID:<input type="text" name="userid"><br>

    密码:<input type="text" name="userpass"><br>

    <input type="submit" value="登录">

  </form>

将表单数据提交到LoginServlet中进行处理

(2)新建一个名为LoginServlet的Servlet,重写重写doGet(),doPost()方法

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

 

this.doPost(request, response);

}

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

 

String path="findAll.jsp";

String userid1=request.getParameter("userid");

String password1=request.getParameter("userpass");

 

List<String> info=new ArrayList<String>();

if(userid1==null||"".equals(userid1)){

info.add("用户ID不能为空!");

}

if(password1==null||"".equals(password1)){

info.add("密码不能为空!");

}

 

        if(info.size()==0){

         User user=new User();

         user.setUserid(userid1);

         user.setUserspass(password1);

         try {

if(DaoFactory.getUserDaoInstance().findUser(user)){

  info.add("Login Success! welcome "+user.getUsername());

    

}else{

      info.add("Error username or password!");

}

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

        request.setAttribute("info1", info);

        request.getRequestDispatcher(path).forward(request,response);     

}

跳转到的findAll.jsp稍后再写

(3)在接口中添加相应的方法,再在实现类和代理中重写,实现用户登录

public interface UserDAO {

public boolean findUser(User user) throws Exception;

}

 

public class UserDaoImpl implements UserDAO {

......

public boolean findUser(User user) throws Exception {

// TODO Auto-generated method stub

boolean flag = false;

try{

String sql="select * from Iuser where userid=? and userpass=?";

pstmt = this.conn.prepareStatement(sql);

pstmt.setString(1,user.getUserid());

pstmt.setString(2,user.getUserspass());

ResultSet rs = pstmt.executeQuery();

if(rs.next()){

user.setUsername(rs.getString(2));

flag = true;

}

}catch(Exception e){

e.printStackTrace();

}finally{

try{

this.conn.close();

}catch(Exception e){

e.printStackTrace();

}

}

return flag;

}

......

}

 

public class UserDaoPoxy implements UserDAO {

......

public boolean findUser(User user) throws Exception {

// TODO Auto-generated method stub

boolean flag = false;

try{

flag=this.dao.findUser(user);

}catch(Exception e){

e.printStackTrace();

}finally{

this.dbc.close();

}

return flag;

}

......

}

7,用类似的方法实现注册(增),删除,修改的操作

 

代码略

 

8,实现查找与分页显示

(1)新建一个jsp页面用来显示,就是前面提到的findAll.jsp

  <body>

 <% 

        int pageSize=3;

        int currentPage=1;

        int total=DaoFactory.getUserDaoInstance().getCount();

        int lastpage;

        

        if(total%pageSize==0){

lastpage=total/pageSize;

}else{

lastpage=total/pageSize+1;

}

        if(currentPage<1){

           currentPage=1;

        }

        if(currentPage>lastpage)

        {

           currentPage=lastpage;

        }

        

 %>

  

    <%

      request.setCharacterEncoding("gb2312");

      List<String> info2=(List<String>)session.getAttribute("info1");

      if(info2!=null){

       Iterator<String> iter=info2.iterator();

       while(iter.hasNext()){

    %>

           <h1><%=iter.next()%></h1>

    <%     

       }

     }

  

     String keywords=(String)request.getAttribute("kw");

      if(keywords==null){

         keywords="";

      }

     // List<User> all=DaoFactory.getUserDaoInstance().findAll(keywords,currentPage,pageSize);

      List<User> userall=new ArrayList<User>();

      userall=(List<User>)request.getAttribute("userall1");

      Iterator<User> iter=userall.iterator();  

     //Iterator<User> iter=all.iterator();  

    %>

    

    <form action="FindAllServlet" method="post">

       请输入查询关键字:<input type="text" name="kw" value="<%=keywords%>">

       <input type="submit" value="查询"/>

    </form> <br>

    <br>

    <table border="1" >

      <tr>

        <td>Userid</td>

        <td>Username</td>

        <td>Userpass</td>

        <td>操作</td>

      </tr>

       <%

      while(iter.hasNext()){

      User user=iter.next();

   

  %> 

      <tr>

        <td><%=user.getUserid()%></td>

        <td><%=user.getUsername()%></td>

        <td><%=user.getUserspass()%></td>

        <td><a href="Delete.jsp">删除</a>     <a href="Update.jsp">修改</a></td>

      </tr>

     <%

       }    

     

     %>   

     <tr>

</td>

</tr>    

<tr>

 <td>

     共<%=lastpage%>页  

                  第<%=currentPage%>页    

    <a href="FindAllServlet?currentPage=1">首页</a>  

    <a href="FindAllServlet?currentPage=<%=currentPage-1%>">上一页</a>  

    <a href="FindAllServlet?currentPage=<%=currentPage+1%>">下一页</a>  

    <a href="FindAllServlet?currentPage=<%=lastpage%>">尾页</a>

</td>

</tr>    

     </table>

  </body>

(2),创建一个名为FindAllServlet的Servlet,重写doGet(),doPost()方法

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

 

this.doPost(request, response);

}

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

 

 

int pageSize=3;

int currentPage;

String page = request.getParameter("currentPage");

if(page!=null){

currentPage=Integer.parseInt(request.getParameter("currentPage"));

}else{

currentPage=1;

}

request.setCharacterEncoding("gb2312");

String keywords=request.getParameter("kw");

 

if(keywords==null){

         keywords="";

      }

String path="findAll.jsp";

List<User> userall = null;

try {

userall = DaoFactory.getUserDaoInstance().findAll(keywords,currentPage,pageSize);

request.setAttribute("userall1", userall);

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

 

    request.setAttribute("kw", keywords);

request.getRequestDispatcher(path).forward(request,response);

}

(3),添加具体的方法来实现按条件查询,并且将结果分页显示

 

首先实现按条件查询

public interface UserDAO {

......

public List<User> findAll(String keyWord)throws Exception;

......

}

 

public class UserDaoImpl implements UserDAO {

......

List<User> all = new ArrayList<User>();

User user = null;

String sql="select * from Iuser where userid like ? or username like ?";

this.pstmt=this.conn.prepareStatement(sql);

pstmt.setString(1,"%"+keyWord+"%");

pstmt.setString(2,"%"+keyWord+"%");

ResultSet rs=this.pstmt.executeQuery();

while(rs.next()){

user=new User();

user.setUserid(rs.getString(1));

user.setUsername(rs.getString(2));

user.setUserspass(rs.getString(3));

all.add(user);

}

this.pstmt.close();

return all;

......

}

 

public class UserDaoPoxy implements UserDAO {

......

List<User> all=null;

try {

all=this.dao.findAll(keyWord);

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}finally{

this.dbc.close();

}

return all;

......

}

 

然后利用上述方法返回的集合实现分页查询

实现的方法如下

public interface UserDAO {

......

public List<User> findAll(String keyWord,int currentPage,int pageSize)throws Exception;

......

}

 

public class UserDaoImpl implements UserDAO {

......

ist<User> all=new ArrayList<User>();

all=this.findAll(keyWord);

int total=all.size();

int lastpage;

if(total%pageSize==0){

lastpage=total/pageSize;

}else{

lastpage=total/pageSize+1;

}

if(currentPage<1){

currentPage=1;

}

if(currentPage>lastpage){

currentPage=lastpage;

}

int fromIndex=(currentPage-1)*pageSize;

     int toIndex=fromIndex+pageSize;

     if(toIndex>total){

     toIndex=total;

     }

all=all.subList(fromIndex, toIndex);

System.out.println(all.size());

return all;

......

}

 

public class UserDaoPoxy implements UserDAO {

......

ublic List<User> findAll(String keyWord, int currentPage, int pageSize)

throws Exception {

// TODO Auto-generated method stub

List<User> all=new ArrayList<User>();

all=this.dao.findAll(keyWord,currentPage,pageSize);

this.dbc.close();

return all;

}

......

}

这样能很好的实现控制器接收用户的请求,并决定应该调用哪个模型来进行处理,然后模型用业务逻辑来处理用户的请求并返回数据,最后控制器用相应的视图格式化模型返回的数据,并通过表示层呈现给用户。

原文地址:https://www.cnblogs.com/420Rock/p/6816863.html