JavaWeb学习总结——MVC(尚硅谷_佟刚老师)

一、MVC

1.1概念

Model-View-Controller(模型—视图—控制器)

视图:页面。作用 

             显示相关数据、接受用户输入、不进行实际的业务处理(Model做)

控制器:接收用户的输入并调用模型处理请求,调用视图返回数据

模型:是应用程序的主体部分,表示业务逻辑和业务数据

             一个模型能为多个视图提供数据

 

Model

Servlet——控制器。接收请求,调用类方法。

POJO——处理逻辑、业务逻辑、处理数据库

转向——目前两种方式:转发,重定向

 


 

二、简单MVC案例

2.1 设计原理

简单MVC设计模式:

  test.jsp——发送请求到ServletlistAllStudents

<a href="listAllStudents">List All Students</a>

  Servlet——daGet方法:往属性域里放一个属性

通过转发的方式到页面/students.jsp

public class ListAllStudentServlet extends HttpServlet {

         private static final long serialVersionUID = 1L;

         protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

                   request.setAttribute("student", Arrays.asList("AA","BB","XX"));

                   request.getRequestDispatcher("/students.jsp").forward(request, response);

         }

}

  student.jsp——获取属性值,显示

         <%=request.getAttribute("student") %>                 //得到request

         <br>

         <%

         List<String> names = (List)request.getAttribute("student");  //显示

         for(String name:names){

         %>

                   <%=name %><br>

         <%

         }

         %>

2.2连接数据库

M——Dao

V——JSP,在页面上填写JAVA代码实现显示

C——Servlet

代码:

testAllUsers.jsp

<a href="listAllStudents">List All Users</a>

ListAllStudentServlet

StudentDao studentDao = new StudentDao();

List<Student> students = studentDao.getAll();

 

request.setAttribute("studens", students);

request.getRequestDispatcher("/students.jsp").forward(request, response);

students.jsp

<%

        List<Student> stus = (List)request.getAttribute("studens");

%>

<table border="1" cellpadding="10" cellspacing="0">

    <tr>

        <th>Id</th>

        <th>username</th>

        <th>password</th>

        <th>Delete</th>

    </tr>

 

<%

    for(Student student : stus){

%>

    <tr>

        <td><%=student.getId() %></td>

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

        <td><%=student.getPassword() %></td>

        <td><a href="deleteUsers?Id=<%=student.getId() %>">Delete</a></td>

    </tr>

<%

    }

%>

</table>

DeleteUsersServlet

String Id = request.getParameter("Id");

StudentDao studentDao = new StudentDao();

studentDao.deleteById(Integer.parseInt(Id));

 

request.getRequestDispatcher("/success.jsp").forward(request, response);

success.jsp

    操作成功

    <br><br>

    <a href="listAllStudents">List All Users</a>

StudentDao.java

public List<Student> getAll() {

      

       List<Student> students = new ArrayList<>();

      

       Connection connection =null;

       PreparedStatement preparedStatement = null;

       ResultSet resultSet = null;

      

       try {

           String url = "jdbc:mysql:///test";

           String user = "root";

           String pw = "1234";

           Class.forName("com.mysql.jdbc.Driver");

           connection=DriverManager.getConnection(url, user, pw);

          

           String sql = "SELECT Id,username,password FROM test_users";

           preparedStatement = connection.prepareStatement(sql);

           resultSet = preparedStatement.executeQuery();

           while(resultSet.next()){

              int id=resultSet.getInt(1);

              String username = resultSet.getString(2);

              String password = resultSet.getString(3);

              

              Student student = new Student(id, username, password);

              students.add(student);

           }

       } catch (Exception e) {

           e.printStackTrace();

       }finally{

           try {

              if(resultSet!=null){

                  resultSet.close();

              }

           } catch (Exception e) {

              e.printStackTrace();

           }

           try {

              if(preparedStatement!=null){

                  preparedStatement.close();

              }

           } catch (Exception e) {

              e.printStackTrace();

           }

           try {

              if(connection!=null){

                  connection.close();

              }

           } catch (Exception e) {

               e.printStackTrace();

           }

       }

      

       return students;

    }

 

    public void deleteById(int Id) {

      

       Connection connection =null;

       PreparedStatement preparedStatement = null;

      

       try {

           String url = "jdbc:mysql:///test";

           String user = "root";

           String pw = "1234";

           Class.forName("com.mysql.jdbc.Driver");

           connection=DriverManager.getConnection(url, user, pw);

          

           String sql = "DELETE FROM test_users WHERE Id=?";

           preparedStatement = connection.prepareStatement(sql);

           preparedStatement.setInt(1, Id);

          

           //重要

           preparedStatement.executeUpdate();

          

       } catch (Exception e) {

           e.printStackTrace();

       }finally{

           try {

              if(preparedStatement!=null){

                  preparedStatement.close();

              }

           } catch (Exception e) {

              e.printStackTrace();

           }

           try {

              if(connection!=null){

                  connection.close();

              }

           } catch (Exception e) {

              e.printStackTrace();

           }

       }

    }

Student.java

    privateintId;

    private String username;

    private String password;

getter/setter/有参、无参构造器

2.3不足之处

1. 使用数据连接池,DBUtilsJDBCUtil工具类,DAO基类

2.一个请求Servlet不好!一个模块使用一个Servlet,即多个请求可以使用一个Servlet

3.在页面上加入jQuery提示

三、MVC综合案例

3.1案例技术选型

技术

技术难点

使用C3P0连接池

JDBC工具采用DBUtils

页面提示操作使用jQuery

  多个请求使用一个Servlet

  模糊查询

  创建秀给,验证用户名

是否已经被使用,提示

1.1 MVC框架各部分功能

在实际书写项目时,倒序(从后(mysql)往前(view)写)

3.2创建数据表

Create table MVC_Customers(

id int primary key auto_increment,

name varchar(30) not null unique,

password varchar(30),

phone varchar(30)

);

name字段添加唯一约束

alter table mvc_customers add constraint name_uk unique(name);

不懂

Create中没有么?

3.3 DAO工具

l  加入C3P0数据源

n  C3P0

n  数据库驱动的jar

C3P0lib中复制c3p0-0.9.2.1.jar、、添加mysql.jar

C3P0docindex.html

src下新建c3p0-config.xml

<c3p0-config>

  <named-config name="mvcapp">

    <property name="user">root</property>

    <property name="password">1234</property>

    <property name="driverClass">com.mysql.jdbs.Driver</property>

    <property name="jdbcUrl">jdbc:mysql:///test</property>

 

    <property name="acquireIncrement">5</property>

    <property name="initialPoolSize">10</property>

    <property name="minPoolSize">10</property>

    <property name="maxPoolSize">50</property>

 

    <property name="maxStatements">20</property>

    <property name="maxStatementsPerConnection">5</property>

 

  </named-config>

</c3p0-config>

Jdbc中添加dataSource连接c3p0

    privatestatic DataSource dataSource = null;

    static{

       dataSource = new ComboPooledDataSource("mvcapp");

    }

测试类Junit

点击next,选择getConnection

getConnection return dataSource.getConnection()

l  编写DAOJdbcUtils工具类和CustomerDAO接口

l  提供CustomerDAO接口的实现类:CustomerDAOJdbcImpl

3.4多个请求使用一个Servlet           

方法一:

方法二:

3.4 查询操作的实现

l  页面

l  实现方法

Index.jsp页面

<form action="query.do" method="post">

       <table >

           <tr>

           <td>UserName</td>

           <td><input type="text" name="name"/></td>

           </tr>

          

           <tr>

           <td>Password</td>

           <td><input type="text" name="name"/></td>

           </tr>

          

           <tr>

           <td>Phone</td>

           <td><input type="text" name="name"/></td>

           </tr>

          

           <tr>

           <td><input type="submit" value="Query"/></td>

           <td><a href="">Add New User</a></td>

           </tr>

       </table>

    </form>

   

    <br><br>

    <%

       List<Customer> customers = (List<Customer>)request.getAttribute("customers");

       if(customers!=null&&customers.size()>0){

    %>

    <hr>

    <br><br>

           <table border="1" cellpadding="10" cellspacing="0">

           <tr>

              <th>ID</th>

              <th>UserName</th>

              <th>Password</th>

              <th>Phone</th>

              <th>UPDATE/DELETE</th>

           </tr>

           <%

              for(Customer customer : customers){

           %>

              <tr>

                  <td><%=customer.getId() %></td>

                  <td><%=customer.getName() %></td>

                  <td><%=customer.getPassword() %></td>

                  <td><%=customer.getPhone() %></td>

                  <td>

                     <a href="">UPDATE</a>

                     <a href="">DELETE</a>

                  </td>

              </tr>     

           <%

              }

           %>

           </table>

    <% 

       }

    %>

3.5 模糊查询

1)       CustomerDAO中封装查询条件getForListWithCriteriaCustomer

         public List<Customer> getForListWithCriteriaCustomer(CriteriaCustomer cc);

2)       CustomerDAOJdbcImpl中完成对应方法

     public List<Customer> getForListWithCriteriaCustomer(CriteriaCustomer cc) {

String sql = "SELECT id,name,password,phone FROM mvc_customers WHERE "    + "name LIKE ? AND password LIKE ? AND phone LIKE ?";

return getForList(sql, cc.getName(),cc.getPassword(),cc.getPhone());

    }

3)       CustomerReflectServlet

3.6删除操作

l  加入jQuery的方法

n  WebContent下建scripts文件夹,将jquery-1.7.2.js导入

n  index中的<head></head>中添加如下代码

<title>Insert title here</title>

<script type="text/javascript" src="scripts/jquery-1.7.2.js"></script>

<script type="text/javascript">

     $(function(){

         $(".delete").click(function(){

              var content = $(this).parent().parent().find("td:eq(1)").text();

              var flag = confirm("确定要删除"+content+"的信息么?");

              return flag;  });

     });

</script>

</head>

3.7添加操作

1Register New User 超链接连接到newUser.jsp

2)新建newUser.jsp

3)在ServletaddUser()中

privatevoid addCustomer(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //1.获取表单参数:namepasswordphone

        String name = request.getParameter("name");

        String password = request.getParameter("password");

        String phone = request.getParameter("phone");

//          检验name是否被占用

//          调用CustomerDAOgetCountWithName(String name)获取那么在数据库中的个数

        long count = customerDAO.getCountWithName(name);

//          若返回值大于零,则响应newUser.jsp页面(转发)

        System.out.println("Count::::"+count);

        if (count > 0){

//            a显示错误消息:request中放入一个属性message:用户名name已经被占用,请重新选择!

//                          在页面上通过request.getAttribute("message")的方式显示

            request.setAttribute("message", "用户名"+name+"已经被占用,请重新选择!");

//            b表单值回显: value="<%=request.getParameter("name")==null?"":request.getParameter("name")%>"

//            c结束方法:return

            request.getRequestDispatcher("/newUser.jsp").forward(request, response);

            //大于零不用往后执行,不用else,直接可以用return

            return ;

           

        }

        //2.若验证通过,则把表单参数封装在一个Customer对象中

        Customer customer = new Customer(name, password, phone);

        //3.调用CustomerDaosave(Customer customer)执行保存操作

        customerDAO.save(customer);

        //4.重定向到success.jsp页面(用转发,表单会重复提交)

        response.sendRedirect("success.jsp");

    }

 

3.8修改操作

1)先显示(SELECT操作)修改的页面,在进行(UPDATE

2)显示修改的页面

Update的超链接

<a href="edit.do?id=<%=customer.getId() %>">UPDATE</a>

edit方法:获取id,调用CustomerDAO的方法获取id对应的Customer对象

  应一个页面:使用隐藏域来保存要求改的Customer对象的id

<input type=”hidden” name=”id” value=”<%= customer.getid%>”/>

提交到Update.do

3)修改操作

 

四、老师MVC案例小结(1

4.1 整体架构:MVC设计模式到底如何落地

4.2多个请求对应一个servlet

1Servlet映射为*.do :可以接受一切.do 结尾的请求

创建CustomerReflectServletedit

2)在ServletdoGetdoPost方法中:

//1. 获取ServletPath: /edit.do/addCustomer.do

String servletPath = request.getServletPath();     

//2. 去除/ he .do, 得到类似于editaddCustomer这样的字符串

    String methodName = servletPath.substring(1, servletPath.length() - 3);

    try {

        //3.利用反射获取methodName对应的方法

Method method = getClass().getDeclaredMethod(methodName, HttpServletRequest.class,HttpServletResponse.class);

        //4.利用反射调用对应的方法

            method.invoke(this, request, response);

        } catch (Exception e) {

        //人性化设计有一些相应(若要调用的方法不存在,相应一个error.jsp页面)

            response.sendRedirect("error.jsp");

}

4.3查询:MVC的整个流程

query.Do>doPost>query>JSP

query方法的代码

//1.调用CustomerDAO()得到Customer的集合

    List<Customer> customers = customerDAO.getForListWithCriteriaCustomer(cc);

    //利用反射调用

//2.Customer的集合放入request

    request.setAttribute("customers", customers);

//3.转发页面到index.jsp(不能使用重定向)

    request.getRequestDispatcher("/index.jsp").forward(request, response);

JSP:获取request中的customer属性,遍历显示

<%

List<Customer> customers = (List<Customer>)request.getAttribute("customers");

    if(customers!=null&&customers.size()>0){

%>         

<%

        for(Customer customer : customers){

%>

        <tr>

            <td><%=customer.getId() %></td>

            <td><%=customer.getName() %></td>

            <td><%=customer.getPassword() %></td>

            <td><%=customer.getPhone() %></td>

            <td>

                <a href="">UPDATE</a>

            </td>

            <td>

                 <a href="delete.do?id=<%=customer.getId() %>" class="delete">DELETE</a>

            </td>

        </tr>      

<%

        }

%>

4.4模糊查询

1)正常的SQL

String sql = "SELECT id,name,password,phone FROM mvc_customers WHERE "    + "name LIKE ? AND password LIKE ? AND phone LIKE ?";

2)填充占位符的技巧:以name属性为例:若name字段为null,返回“%%”;若不为null,返回“%+name+%

       if (name == null)

           name = "%%";

       else

           name = "%" + name + "%";

       returnname;

3)把查询条件封装为一个JavaBean

publicclass CriteriaCustomer {

    private String name;

    private String password;

    private String phone;

//……

}



  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值