前面讲到 对于一个 pojo user 操作 CRUD 需要定义四种操作处理器 如果pojo多,带来的是代码和配置的暴增
针对这种情况 Spring Web MVC提供的MultiActionController,用于支持在一个控制器里添加多个功能处理方法,即将多个请求的处理方法放置到一个控制器里,这种方式不错
编写的方法满足规则:
1、返回值:即模型和视图部分;
ModelAndView:模型和视图部分,之前已经见过了;
Map:只返回模型数据,逻辑视图名会根据RequestToViewNameTranslator 实现类来计算,稍候讨论;
String:只返回逻辑视图名;
void:表示该功能方法直接写出response响应(如果其他返回值类型(如Map)返回null则和void进行
相同的处理);
2、actionName:功能方法名字;由methodNameResolver 根据请求信息解析功能方法名,通过反射调用;
3、形参列表:顺序固定,“[]”表示可选
//a. 表示到新增页面
public ModelAndView Add(HttpServletRequest request, HttpServletResponse response);
//b. 表示新增表单提交,在最后可以带着命令对象
public ModelAndView add(HttpServletRequest request, HttpServletResponse response, UserModel user);
//c. 列表,但只返回模型数据,视图名会通过RequestToViewNameTranslator 实现来计算
public Map list(HttpServletRequest request, HttpServletResponse response);
//d. 文件下载,返回值类型为void,表示该功能方法直接写响应
public void fileDownload(HttpServletRequest request, HttpServletResponse response)
//e. 第三个参数可以是session
public ModelAndView sessionWith(HttpServletRequest request, HttpServletResponse response, HttpSession session);
//f. 如果第三个参数是session,那么第四个可以是命令对象,顺序必须是如下顺序
public void sessionAndCommandWith(HttpServletRequest request, HttpServletResponse response,
HttpSession session,UserModel user)
4、异常处理方法,MultiActionController 提供了简单的异常处理,即在请求的功能处理过程中遇到异常会交给异常处
理方法进行处理,式如下所示:
public ModelAndView anyMeaningfulName(HttpServletRequest request, HttpServletResponse response, ExceptionClass
exception)
MultiActionController 会使用最接近的异常类型来匹配对应的异常处理方法,示例如下所示:
//处理PayException
public ModelAndView processPayException(HttpServletRequest request, HttpServletResponse response, PayException ex)
//处理Exception
public ModelAndView processException(HttpServletRequest request, HttpServletResponse response, Exception ex)
举个实例说明下:
第一步: 编写用户服务类 (用户类就用前面现成的 UserModel:username,password)
UserService.java
public class UserService { //内存存储下 用列表 public static List<UserModel> usList = new ArrayList<UserModel>(); //新增 public void create(UserModel user){ System.out.println("create user"); usList.add(user); } public void update(UserModel user){//更新 System.out.println("update user"); for (int i = 0; i < usList.size(); i++) { if (usList.get(i).getUsername().equals(user.getUsername())) { usList.remove(i); } } usList.add(user); } public void delete(UserModel user){//删除 System.out.println("delete user"); for (int i = 0; i < usList.size(); i++) { if (usList.get(i).getUsername().equals(user.getUsername())) { usList.remove(i); } } } public UserModel get(String key){//更加用户名 获取用户实例 for (int i = 0; i < usList.size(); i++) { if (usList.get(i).getUsername().equals(key)) { return usList.get(i); } } return null; } public List list(){//获取用户列表 return usList; } }
第二步、编写 用户控制器 继承 MultiActionController
public class UserController extends MultiActionController { // 用户服务类 private UserService userService; // 逻辑视图名 通过依赖注入方式注入 实现可配置 private String createView; private String updateView; private String deleteView; private String listView; private String redirectToListView; //省略。。。 get set public String create(HttpServletRequest request, HttpServletResponse response, UserModel user) { if ("GET".equals(request.getMethod())) { // 如果是get请求 转向 新增页面 return getCreateView(); } userService.create(user); // 直接重定向到列表页面 return getRedirectToListView(); } public ModelAndView update(HttpServletRequest request, HttpServletResponse response, UserModel user) { if ("GET".equals(request.getMethod())) { // 如果是get请求 转向更新页面 ModelAndView mv = new ModelAndView(); // 查询要更新的数据 mv.addObject("command", userService.get(user.getUsername())); mv.setViewName(getUpdateView()); return mv; } userService.update(user); // 直接重定向到列表页面 return new ModelAndView(getRedirectToListView()); } public ModelAndView delete(HttpServletRequest request, HttpServletResponse response, UserModel user) { if ("GET".equals(request.getMethod())) { // 如果是get请求 转向删除页面 ModelAndView mv = new ModelAndView(); // 查询要删除的数据 mv.addObject("command", userService.get(user.getUsername())); mv.setViewName(getDeleteView()); return mv; } userService.delete(user); // 重定向到列表页面 return new ModelAndView(getRedirectToListView()); } public ModelAndView list(HttpServletRequest request, HttpServletResponse response) { ModelAndView mv = new ModelAndView(); mv.addObject("userList", userService.list()); mv.setViewName(getListView()); return mv; } // 如果使用委托方式,命令对象名称只能是command protected String getCommandName(Object command) { // 命令对象的名字默认command return "command"; } }
第三步、配置 spring3mvc-servlet.xml
<!-- 一个处理入口 对应多个处理过程 --> <bean id="userService" class="com.auto.oper.config.service.UserService"/> <bean name="/user/**" class="com.auto.oper.config.web.UserController"> <property name="userService" ref="userService"></property> <property name="createView" value="user/create"></property> <property name="updateView" value="user/update"></property> <property name="deleteView" value="user/delete"></property> <property name="listView" value="user/list"></property> <property name="redirectToListView" value="redirect:/user/list"></property> <!-- 使用PropertiesMethodNameResolver来解析功能处理方法名--> <!--property name="methodNameResolver" ref="propertiesMethodNameResolver"/--> </bean>
第四步、新建页面 WEB-INF/jsp/user/ create.jsp delete.jsp list.jsp update.jsp
list.jsp
<a href="${pageContext.request.contextPath}/user/create">用户新增</a> <br /> <table border="1" width="50%"> <tr> <th> 用户名 </th> <th> 密码 </th> <th> 操作 </th> </tr> <c:forEach items="${userList}" var="user"> <tr> <td> ${user.username } </td> <td> ${user.password } </td> <td> <a href="${pageContext.request.contextPath}/user/update?username=${user.username}">更新</a> | <a href="${pageContext.request.contextPath}/user/delete?username=${user.username}">删除</a> </td> </tr> </c:forEach> </table>
create.jsp
<form action="${pageContext.request.contextPath}/user/create" method="post"> 用户名: <input type="text" name="username" value="" /> <br /> 密码: <input type="text" name="password" value="" /> <br /> <input type="submit" value="添加" /> </form>
update.jsp
<form action="${pageContext.request.contextPath}/user/update" method="post"> 用户名: <input type="text" name="username" value="${command.username}" /> <br /> 密码: <input type="text" name="password" value="${command.password}" /> <br /> <input type="submit" value="更新" /> </form>
delete.jsp
<form action="${pageContext.request.contextPath}/user/delete" method="post"> 用户名: <input type="text" name="username" value="${command.username}" /> <br /> 密码: <input type="text" name="password" value="${command.password}" /> <input type="submit" value="删除" /> </form>