zoukankan      html  css  js  c++  java
  • 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;

    }

    ......

    }

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

  • 相关阅读:
    实验二 K-近邻算法及应用
    实验1 感知器及其应用
    实验三 面向对象分析与设计
    结构化分析与设计
    实验一 软件开发文档与工具的安装与使用
    ATM管理系统
    流程图与活动图的区别与联系
    四则运算
    实验四 决策树算法及应用
    实验三 朴素贝叶斯算法及应用
  • 原文地址:https://www.cnblogs.com/420Rock/p/6816863.html
Copyright © 2011-2022 走看看