JavaWeb学习总结——MVC(尚硅谷_佟刚老师)
2016-10-26 11:26
447 查看
一、MVC
1.1概念
Model-View-Controller(模型—视图—控制器)视图:页面。作用
:
显示相关数据、接受用户输入、不进行实际的业务处理(Model做)
控制器:接收用户的输入并调用模型处理请求,调用视图返回数据
模型:是应用程序的主体部分,表示业务逻辑和业务数据
一个模型能为多个视图提供数据
POJO——处理逻辑、业务逻辑、处理数据库 转向——目前两种方式:转发,重定向 |
二、简单MVC案例
2.1 设计原理
①
test.jsp——发送请求到Servlet(listAllStudents)
<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——DaoV——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. 使用数据连接池,DBUtils,JDBCUtil工具类,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包
C3P0—lib中复制c3p0-0.9.2.1.jar、、添加mysql.jar C3P0—doc—index.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 提供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中封装查询条件getForListWithCriteriaCustomerpublic List<Customer> getForListWithCriteriaCustomer(CriteriaCustomer cc); |
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.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> |
超链接连接到newUser.jsp
2)新建newUser.jsp
3)在Servlet的addUser()中
[b]privatevoid addCustomer(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.获取表单参数:name,password,phone String name = request.getParameter("name"); String password = request.getParameter("password"); String phone = request.getParameter("phone"); // 检验name是否被占用 // ①调用CustomerDAO的getCountWithName(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.调用CustomerDao的save(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 |
四、老师MVC案例小结(1)
4.1 整体架构:MVC设计模式到底如何落地
4.2多个请求对应一个servlet
1)Servlet映射为*.do:可以接受一切.do
结尾的请求
创建CustomerReflectServlet时edit |
//1. 获取ServletPath: /edit.do或/addCustomer.do String servletPath = request.getServletPath(); //2. 去除/ he .do, 得到类似于edit或addCustomer这样的字符串 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—>JSPquery方法的代码 |
//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)正常的SQLString sql = "SELECT id,name,password,phone FROM mvc_customers WHERE " + "name LIKE ? AND password LIKE ? AND phone LIKE ?"; |
if (name == null) name = "%%"; else name = "%" + name + "%"; returnname; |
publicclass CriteriaCustomer { private String name; private String password; private String phone; //…… } |
相关文章推荐
- JavaWeb学习总结——JavaWEB_JSP(尚硅谷_佟刚老师)
- JavaWeb学习总结——Struts2上传下载(尚硅谷_佟刚老师)
- JavaWeb学习总结——Struts2国际化(尚硅谷_佟刚老师)
- JavaWeb学习总结——JavaWEB_Session(尚硅谷_佟刚老师)(
- JavaWeb学习总结——Struts2入门与实例(尚硅谷_佟刚老师)
- JavaWeb学习总结——JavaWEB_Servlet(尚硅谷_佟刚老师)
- JavaWeb学习总结——通用标签和表单标签(尚硅谷_佟刚老师)
- Javaweb学习第三天,CSS(知识点来自广陵散老师总结)
- 4._尚硅谷_佟刚_JavaWEB_MVC_设计模式
- 马毅老师讲座收获总结
- javaweb学习总结(十八)——JSP属性范围
- JavaWeb学习总结(十三)——使用Session防止表单重复提交
- java 技术训练营 宋红康老师、 佟刚老师 金牌讲师课件分享
- JavaWeb学习总结(一)
- ASP.Net MVC 远程部署总结
- PHP MVC简单介绍,对PHP当前主流的MVC做了一个总结
- MVC三层模型(struts+spring+hibernate)总结
- JavaWeb学习总结(十二)——Session