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

从零开始写javaweb框架笔记9-细节完善与代码优化-完善控制器层

2016-01-10 13:15 791 查看
    在这一小节中,我们开始写jsp页面

 打开/WEB-INF/view/customer.jsp文件,完成如下代码:

<%--
Created by IntelliJ IDEA.
User: jack
Date: 2015/12/5
Time: 23:02
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="BASE" value="${pageContext.request.contextPath}"/>
<html>
<head>
<title>客户管理</title>
</head>
<body>
<h1>客户列表</h1>
<table>
<thead>
<tr>
<th>客户名称</th>
<th>联系人</th>
<th>电话号码</th>
<th>邮箱地址</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<c:forEach var="customer" items="${customerList}">
<tr>
<td>${customer.name}</td>
<td>${customer.contact}</td>
<td>${customer.telephone}</td>
<td>${customer.email}</td>
<td>
<a href="${BASE}/customer_edit?id=${customer.id}">编辑</a>
<a href="${BASE}/customer_delete?id=${customer.id}">删除</a>
</td>
</tr>
</c:forEach>
</tbody>
</table>
</body>
</html>


   小技巧:在IDEA中,查找文件三种方法,ctrl+n,根据java类名进行查找,ctrl+shift+n,根据任意文件名进行查找,在project目录树中,使用ctrl+shift+f在指定路径下查找文件
     我们已经完成了第一个jsp页面的编写了,现在我们部署到Tomcat中,具体的部署方法,参考http://blog.csdn.net/j903829182/article/details/50097471,然后再IDEA中启动tomcat,我在启动tomcat的时候,爆错了,错误关键信息如下:

Caused by: java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed 

to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/chapter2]]

Caused by: java.lang.IllegalArgumentException: Invalid <url-pattern> customer_create in servlet mapping

然后,我通过网上找资料,看到资料上说是web.xml里面的路径配置有问题,但是我这里使用的是servlet3,没有在web.xml里面配置啊,  但是我使用了annotation来进行配置,当看到Invalid <url-pattern> customer_create
in servlet mapping这个信息的时候,我就想是不是以前customer_create里面的注解配置,错误了,然后仔细检查的确配置错误了,

正确的应该是:

@WebServlet("/customer_create")

我配置错误的为:

@WebServlet("customer_create")

   所以解决办法很简单了,改为正确的配置就ok了。

      解决错误后,打开浏览器,输入地址http://localhost:8080/chapter2/customer然后,我们就会看到下面的界面,如下图:



     现在CutomerServlet已经开发完毕了,但是还有四个Servlet等待着我们去完成。

     我们可以想象,随着业务需求的不断扩展,请求个数一定会不段增长,那么Servlet的数量一定会不断增多,势必会增加我们日后维护的工作量,因此我们应该想一个办法减少Servlet的数量。

     是否将同一个业务模块的Servlet合并到一个类中去呢?比如我们正在开发的这五个Servlet:CustomerServlet,CustomerShowServlet,CustomerCreateServlet,CustomerEditServlet,CustomerDeleteServlet,合并到一个名为CustomerController类中。

    也就是说,在CustomerController中包含了若干方法,每个方法都处理一种特定的请求,就像下面这样:

package org.jack.com.controller;

/**
* Created by jack on 2016/1/10.
*/

import org.jack.com.model.Customer;
import org.jack.com.service.CustomerService;
import java.util.List;
import java.util.Map;

/**
* 处理客户管理相关请求
*/
@Controller
public class CustomerController {
@Inject
private CustomerService customerService;
/**
* 进入客户列表界面
*/
@Action("get:/customer")
public view index(Param param){
List<Customer> customerList=customerService.getCustomerList();
return new view("customer_show.jsp").addModel("customerList",customerList);
}
/**
* 显示客户信息
*/
@Action("get:/customer_show")
public view show(Param param){
long id=param.getLong("id");
Customer customer=customerService.getCustomer(id);
return new view("customer_show.jsp").addModel("customer",customer);
}
/**
* 进入创建客户 界面
*/
@Action("get:/customer_create")
public view create(Param param){
return new view("customer_create.jsp");
}
/**
* 处理创建客户请求
*/
@Action("post:/customer_create")
public Data createSubmit(Param param){
Map<String,Object> fieldMap=param.getMap();
boolean result=customerService.createCustomer(fieldMap);
return new Data(result);
}
/**
* 进入编辑客户界面
*/
@Action("get:/customer_edit")
public view edit(Param param){
long id=param.getLong("id");
Customer customer=customerService.getCustomer(id);
return new View("customer_edit.jsp").addModel("customer",customer);
}
/**
* 处理编辑客户请求
*/
@Action("put:/customer_edit")
public Data editSubmit(Param param){
long id=param.getLong("id");
Map<String,Object> fieldMap=param.getMap();
boolean result=customerService.updateCustomer(id,fieldMap);
return new Data(result);
}
/**
* 处理编辑客户请求
*/
@Action("delete:/customer_edit")
public view delete(Param param){
long id=param.getLong("id");
boolean result=customerService.deleteCustomer(id);
return new Data(result);
}
}


  1)在控制器类上,使用Controller注解,标明该类是一个控制器。
  2)在成员变量上,使用Inject注解,自动创建该成员变量的实例,有一种流行的名称叫注入

  3)在控制器类中包含若干方法(称为Action),每个方法都会只用Get/Post/Put/Delete注解,用于指定请求类型与请求路径。

   4)在Action的参数中,通过Param对象封装所有请求参数,可根据getLong/getFieldMap等方法获取具体类型或所有的请求参数。

  5)在Action的返回值,使用View封装一个jsp页面,使用Data封装一个JSON数据。

   有了这个CustomerController以后,Servlet数量一下子就降下来了,而且还屏蔽了技术细节,这种方式将MVC架构变得更加轻量级。那怎么开发这样一个轻量级的框架呢?在后面我们我们来慢慢学习。

     总结:在前面,我们针对业务需求进行了简单的分析,找出了核心的功能点,并设计了相关的用例额,根据业务实体确定了表结构,通过界面原型设计了URL规范这些设计工作可以用来以后的开发中来。在开发阶段,我们借助了MVC架构,将开发过程分解。我们对服务层进行了细化,使用Apache Commons DbUtils类库开发了一个轻量级JDBC框架。此外还是用了JUnit对每个服务方法进行了单元测试,并提供了一种数据库初始化的解决方案,让单元测试更加具备可测性。针对一个具体业务需求,从后端到前端一次集成,使数据得到了实现,但界面有些丑陋,在以后的我会慢慢的完善,使用bootstrap来美化界面。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  jsp java web jstl