您的位置:首页 > 编程语言 > Java开发

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

2016-10-26 11:26 447 查看

一、MVC

1.1概念

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

视图:页面。作用


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

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

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

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

Model



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

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

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

二、简单MVC案例

2.1 设计原理



简单MVC设计模式:


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——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. 使用数据连接池,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 编写DAO、JdbcUtils工具类和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添加操作

1)Register New User
超链接连接到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

3)修改操作

四、老师MVC案例小结(1)

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



4.2多个请求对应一个servlet

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

创建CustomerReflectServlet时edit

2)在Servlet的doGet和doPost方法中:

//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—>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;

//……

}

[/b]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: