
META-INF.resources.admin.docs.controller.jsp Maven / Gradle / Ivy
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="admin" uri="http://www.infop.cn/tag/admin"%>
控制器层
介绍
控制器用于接受请求,来自表单的请求,接收其有数;响应数据给请求方,根据请求参数,查询数据或加工数据,然后将数据返回。
控制器的命名:
- @WebServlet的值以
.jsp
结尾,表示返回页面。
- @WebServlet的值以
.do
结尾,表示功能,不返回页面,可能返回json
。
分页查询控制器
分类控制器调用DAO层的方法
public DataTablesResponse<T>
findAll(DataTablesRequest dtr, String[] searchFields)
,并返回一个
json
给前端JavaScript使用。
package cn.infop.controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.infop.dao.MenuDao;
import cn.infop.datatables.DataTablesRequest;
import cn.infop.datatables.DataTablesResponse;
import cn.infop.entity.Menu;
import cn.infop.tools.JsonUtils;
@WebServlet("/root/menu-data.do")
public class MenuData extends HttpServlet {
private static final long serialVersionUID = 8625540450948908487L;
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
DataTablesResponse<Menu> pd = new MenuDao().findAll(new DataTablesRequest(request),
new String[] { "name", "position", "pname", "uri", "icon" });
JsonUtils.printJson(response, pd);
}
}
返回页面控制器
本框架中,写一个CURD程序,需要用到3~3个返回页面的控制器。
- 显示列表页面,以分页显示记录。@WebServlet的值是/console/xxx-list.jsp
- 显示详情页面。@WebServlet的值是/console/xxx-detail.jsp
- 显示添加页面。@WebServlet的值是/console/xxx-add.jsp
- 显示修改页面。@WebServlet的值是/console/xxx-edit.jsp
下面列出一个控制器,以作示例。
package cn.infop.controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/console/menu-list.jsp")
public class MenuList extends HttpServlet {
private static final long serialVersionUID = -4838051497092364432L;
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.getRequestDispatcher("/admin/menu/list.jsp").forward(request, response);
}
}
细心的您可能会发现,响应请求的方法不是doGet(),也不是doPost(),而是service()。为什么要使用这个方法呢?service()方法可以响应doGet()和doPost等多种请求,避免出现405错误。
修改和显示详情页面需要返回数据,按下面这样的方式写:
package cn.infop.controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.infop.dao.MenuDao;
import cn.infop.entity.Menu;
@WebServlet("/console/menu-edit.jsp")
public class MenuEdit extends HttpServlet {
private static final long serialVersionUID = 288034539384707309L;
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String name = request.getParameter("name");
MenuDao dao = new MenuDao();
Menu menu = dao.getBean("select * from menus where name = ?", new Object[] { name });
request.setAttribute("menu", menu);
request.getRequestDispatcher("/admin/menu/edit.jsp").forward(request, response);
}
}
显示详情页面的控制器和显示修改页面的控制器是类似的写法,都需要返回数据。
保存、更新控制器
保存控制器和更新控制器,调用方法
save(String[] fields, Object[] params)
和方法
public int update(String[] fields, Object[] params,
int ConditionalLocation)
分别贴出这两个控制器的代码,以便查用。
package cn.infop.controller;
import java.io.IOException;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.infop.dao.MenuDao;
import cn.infop.tools.ConstantUtils;
@WebServlet("/console/menu-save.jsp")
public class MenuSave extends HttpServlet {
private static final long serialVersionUID = 4866717001030579736L;
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String name = request.getParameter("name");
String position = request.getParameter("position");
String pname = request.getParameter("pname");
String uri = request.getParameter("uri");
String icon = request.getParameter("icon");
MenuDao dao = new MenuDao();
try {
//当初设计这个写法,是因为使用POJO在控制器和DAO层之间传递数据太麻烦,
//在传递的过程中还要做数据转换,将String类型转换成其它数据类型
dao.save(
new String[] { "name", "position", "pname", "uri", "icon" },
new Object[] { name, position, pname, uri, icon }
);
//保存成功返回消息提示
request.setAttribute("msg", ConstantUtils.MSG_SAVED);
//保存成功后跳转到显示列表的控制器
request.getRequestDispatcher("/console/menu-list.jsp").forward(request, response);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
修改控制器与保存控制器逻辑类似,这样写:
package cn.infop.controller;
import java.io.IOException;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.infop.dao.MenuDao;
import cn.infop.tools.ConstantUtils;
@WebServlet("/console/menu-update.jsp")
public class MenuUpdate extends HttpServlet {
private static final long serialVersionUID = -8350914616406383767L;
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String name = request.getParameter("name");
String position = request.getParameter("position");
String pname = request.getParameter("pname");
String uri = request.getParameter("uri");
String icon = request.getParameter("icon");
MenuDao dao = new MenuDao();
try {
// 当初设计这个写法,是因为使用POJO在控制器和DAO层之间传递数据太麻烦,
// 在传递的过程中还要做数据转换,将String类型转换成其它数据类型
dao.update(
new String[] { "position", "pname", "uri", "icon", "name", },
new Object[] { position, pname, uri, icon, name },
4);
// 保存成功返回消息提示
request.setAttribute("msg", ConstantUtils.MSG_UPDATED);
// 保存成功后跳转到显示列表的控制器
request.getRequestDispatcher("/console/menu-list.jsp").forward(request, response);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
删除控制器
删除记录时,必须要指定条件,不指定条件整张的数据都删除,后果很严重。
SQL条件通常是主键。
package cn.infop.controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.infop.dao.MenuDao;
import cn.infop.tools.ConstantUtils;
@WebServlet("/console/menu-delete.jsp")
public class MenuDelete extends HttpServlet {
private static final long serialVersionUID = -837199851714432550L;
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String name = request.getParameter("name");
MenuDao dao = new MenuDao();
//dao.deleteById(id); //如果主键是整数类型,使用此方法
//如果如果主键是字符类型,写SQL脚本,使用public int execute(String sql, Object[] params)方法
dao.execute("delete from menus where name = ?", new Object[] { name });
request.setAttribute("msg", ConstantUtils.MSG_DELETED);
request.getRequestDispatcher("/admin/menu/edit.jsp").forward(request, response);
}
}