基于JSP+Serlvet+JDBC的开发(2)- Servlet类的实现

上一篇我把项目的整个结构搭好了,这里写一下Servlet的实现。

利用Servlet开发有一个弊端就是每一个请求URL都要有对应的Servlet与之对应,但是这样会造成Servlet臃肿,在web.xml中也会出现一大堆Servlet配置信息。为了解决这个问题,我这里利用给Servlet传一个action参数来使一个Servlet处理一类请求。

具体实现如下:

在Serlvet中创建一个数组,记录所有请求这个Servlet的操作,

1 private static final String[] action = { "", "save", "delete", "query", "update", "ajax-type" };

在doPost方法中根据参数action决定要调用的方法

 1 protected void doPost(HttpServletRequest request, HttpServletResponse response)
 2             throws ServletException, IOException {
 3         // 获取action参数
 4         String actionName = request.getParameter("action") != null ? request.getParameter("action") : "";
 5         int actionIndex = 0;
 6         for (int i = 0; i < action.length; i++) {
 7             if (action[i].equals(actionName)) {
 8                 actionIndex = i;// 记录要调用的方法
 9                 break;
10             }
11         }
12
13         // 保存action操作结果[d/r/"", url]
14         String[] r = null;
15         // 根据actionIndex调用对应的方法
16         switch (actionIndex) {
17         case 0:
18             r = index(request, response);// 调用首页方法
19             break;
20         case 1:
21             r = save(request, response);
22             break;
23         case 5:
24             r = ajaxType(request, response);
25         default:
26             // 如果找不到则转发到404.jsp页面
27             r = new String[] { "d", "WEB-INF/jsp/404.jsp" };
28             break;
29         }
30
31         // 根据action操作结果执行相应的操作
32         if ("d".equals(r[0])) {// 转发
33             RequestDispatcher rd = request.getRequestDispatcher(r[1]);
34             rd.forward(request, response);
35         } else if ("r".equals(r[0])) {// 重定向
36             response.sendRedirect(r[1]);
37         } else {// 直接输出r[1]的内容
38             PrintWriter out = response.getWriter();
39             out.println(r[1]);
40             out.flush();
41             out.close();
42         }
43     }

这样如果要调用Serlvet中的save方法处理请求就可以这样访问这个Serlvet,http://127.0.0.1:8080/projectName/servletName?action=save

这里所有Serlvet中的私有处理请求的方法都会返回一个String数组,这个数组包含两个对象,第一个是操作类型,可以是“r”或“d”或其他,其中“r”表示重定向,“d”表示转发,其他则将数组的第二个对象直接输出给客户端。第二个对象是要转发或重定向的url或要输出到客户端的字符串。

如下是Serlvet的save方法:

 1 // 保存实体
 2     private String[] save(HttpServletRequest request, HttpServletResponse response) {
 3         String name = request.getParameter("name");
 4         if (name == null || "".equals(name)) {// 非空校验
 5             request.setAttribute("msg", "类型名称不能为空");
 6             return new String[] { "d", "WEB-INF/jsp/type-save.jsp" };
 7         }
 8         Type t = new Type();
 9         t.setName(name);
10         typeService.save(t);
11
12         String root = request.getContextPath();
13         // 重定向,客户端跳转
14         return new String[] { "r", root + "/type" };
15     }

下面是整个Servlet的完整代码如下(当然这里只用到了index函数,其他函数是后面的功能用到的):

TypeAction.java

  1 package action;
  2
  3 import java.io.IOException;
  4 import java.io.PrintWriter;
  5 import java.util.List;
  6
  7 import javax.servlet.RequestDispatcher;
  8 import javax.servlet.ServletException;
  9 import javax.servlet.http.HttpServlet;
 10 import javax.servlet.http.HttpServletRequest;
 11 import javax.servlet.http.HttpServletResponse;
 12
 13 import model.Type;
 14 import service.TypeService;
 15 import service.impl.TypeServiceImpl;
 16 import util.LogUtil;
 17
 18 public class TypeAction extends HttpServlet {
 19     private static final long serialVersionUID = 1L;
 20
 21     private static final String[] action = { "", "save", "delete", "query", "update", "ajax-type" };
 22     // type 业务
 23     private TypeService typeService = new TypeServiceImpl();
 24
 25     protected void doGet(HttpServletRequest request, HttpServletResponse response)
 26             throws ServletException, IOException {
 27         doPost(request, response);
 28     }
 29
 30     protected void doPost(HttpServletRequest request, HttpServletResponse response)
 31             throws ServletException, IOException {
 32         // 获取action参数
 33         String actionName = request.getParameter("action") != null ? request.getParameter("action") : "";
 34         int actionIndex = 0;
 35         for (int i = 0; i < action.length; i++) {
 36             if (action[i].equals(actionName)) {
 37                 actionIndex = i;// 记录要调用的方法
 38                 break;
 39             }
 40         }
 41
 42         // 保存action操作结果[d/r/"", url]
 43         String[] r = null;
 44         // 根据actionIndex调用对应的方法
 45         switch (actionIndex) {
 46         case 0:
 47             r = index(request, response);// 调用首页方法
 48             break;
 49         case 1:
 50             r = save(request, response);
 51             break;
 52         case 5:
 53             r = ajaxType(request, response);
 54         default:
 55             // 如果找不到则转发到404.jsp页面
 56             r = new String[] { "d", "WEB-INF/jsp/404.jsp" };
 57             break;
 58         }
 59
 60         // 根据action操作结果执行相应的操作
 61         if ("d".equals(r[0])) {// 转发
 62             RequestDispatcher rd = request.getRequestDispatcher(r[1]);
 63             rd.forward(request, response);
 64         } else if ("r".equals(r[0])) {// 重定向
 65             response.sendRedirect(r[1]);
 66         } else {// 直接输出r[1]的内容
 67             PrintWriter out = response.getWriter();
 68             out.println(r[1]);
 69             out.flush();
 70             out.close();
 71         }
 72     }
 73
 74     // 首页
 75     private String[] index(HttpServletRequest request, HttpServletResponse response) {
 76         List<Type> tList = typeService.find();
 77         request.setAttribute("entities", tList);
 78         return new String[] { "d", "WEB-INF/jsp/type-index.jsp" };
 79     }
 80
 81     // 保存实体
 82     private String[] save(HttpServletRequest request, HttpServletResponse response) {
 83         String name = request.getParameter("name");
 84         if (name == null || "".equals(name)) {// 非空校验
 85             request.setAttribute("msg", "类型名称不能为空");
 86             return new String[] { "d", "WEB-INF/jsp/type-save.jsp" };
 87         }
 88         Type t = new Type();
 89         t.setName(name);
 90         typeService.save(t);
 91
 92         String root = request.getContextPath();
 93         // 重定向,客户端跳转
 94         return new String[] { "r", root + "/type" };
 95     }
 96
 97     // 异步拉取type数据
 98     private String[] ajaxType(HttpServletRequest request, HttpServletResponse response) {
 99         List<Type> tList = typeService.find();
100         StringBuffer json = new StringBuffer("{ \"total\" : ").append(tList.size()).append(", \"data\" : [");
101         if (!tList.isEmpty()) {
102             for (int i = 0, size = tList.size(); i < size - 1; i++) {
103                 json = json.append("{\"id\" : ").append(tList.get(i).getId()).append(", \"name\" : \"")
104                         .append(tList.get(i).getName()).append("\"},");
105             }
106             json = json.append("{\"id\" : ").append(tList.get(tList.size() - 1).getId()).append(", \"name\" : \"")
107                     .append(tList.get(tList.size() - 1).getName()).append("\"}");
108         }
109         json = json.append("]}");
110
111         return new String[] { "", json.toString() };
112     }
113 }

在web.xml配置Servlet

1     <servlet>
2         <servlet-name>TypeAction</servlet-name>
3         <servlet-class>action.TypeAction</servlet-class>
4     </servlet>
5     <servlet-mapping>
6         <servlet-name>TypeAction</servlet-name>
7         <url-pattern>/type</url-pattern>
8     </servlet-mapping>

说一下整个程序的流程:

  1. 客户端访问服务器 http://127.0.0.2:8080/goods-show/type,这里type没有action参数,如果没有参数则调用serlvet的index函数,如上面代码,action参数为null时,会被置为""。对应action数组的第一个元素,即case 0: r=index(request,response);break;
  2. index函数被调用,然后typeService.find()会从调用数据库操作查询所有类型实体,然后存在request转发给客户端,这里只能用转发,不能用重定向,否则request的数据将被清空,对于TypeService这个类将在下一篇说到,如下代码:
     List<Type> tList = typeService.find();
     request.setAttribute("entities", tList);
     return new String[] { "d", "WEB-INF/jsp/type-index.jsp" };
  3. index函数利用request.setAttribute("entities", tList);将数据存放在request中,这样在JSP页面中就可以利用EL表达式和JSTL来访问(这样可以做到在JSP中不存在java代码,方便解耦)。
  4. 修改前台静态页面,将其改成动态

     1 <%@ page language="java" contentType="text/html; charset=UTF-8"
     2     pageEncoding="UTF-8"%>
     3 <!DOCTYPE>
     4 <html>
     5 <head>
     6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
     7 <%@ include file="top.jsp"%>
     8 <title>商品展示平台</title>
     9 </head>
    10 <body>
    11     <div>
    12         <div><a href="${root}/send?url=type-save.jsp">添加商品类型</a></div>
    13         <c:forEach items="${entities}" var="obj">
    14             <div>
    15                 <a href="${root}/goods?action=tid&tid=${obj.id}">${obj.name}</a>
    16             </div>
    17         </c:forEach>
    18     </div>
    19 </body>
    20 </html>
  5. 这里引用了一个共同的JSP——top.jsp,这个JSP是用来引入公共资源的,代码如下:

    1 <%@ page language="java" contentType="text/html; charset=UTF-8"
    2     pageEncoding="UTF-8"%>
    3 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
    4 <c:set var="root" value="${pageContext.request.contextPath}" />
    5 <link href="${root}/resources/css/main.css" rel="stylesheet" />

运行结果如下(这里的数据是我事先录入的,乱码情况将在最后使用Filter来处理):

以下是两个张表:

tb_type:

tb_goods:

TypeService等service层和DAO层的实现将在下一篇说到。

时间: 2024-08-10 08:22:47

基于JSP+Serlvet+JDBC的开发(2)- Servlet类的实现的相关文章

基于JSP+Serlvet+JDBC的开发(1)

好久没用JSP+Servlet+JDBC这种组合,可以说自从没有这种作业后就没有这种方式开发了.最近也没怎么学东西,感觉计划都乱了,趁着这个周末写点东西找找感觉. 这次想利用JSP+Servlet+JDBC写个小小的商品展示平台DEMO.功能很简单,就是能够展示商品的类型,然后根据类型展示所属类型的商品就可以了,说是小小的商品展示平台还不如说是一个增删查改的DEMO. 下图是整个项目的结构: 为了方便解耦,使用MVC模式进行开发,这里介绍各个包的作用: action 存放的servlet类,负责

基于JSP+Serlvet+JDBC的开发(4)-- 继续TypeSerlvet的save功能

在type-index.jsp中展示了所有类型,同时也可以添加类型,如下JSP代码: 1 <html> 2 <head> 3 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 4 <%@ include file="top.jsp"%> 5 <title>商品展示平台</title> 6 &

基于JSP+Serlvet+JDBC的开发(5)-- 商品功能

在type-index.jsp中点击商品类型可以进入到该商品类型的所有商品.   商品类型为ITC10的商品信息 View层: goods-index.jsp 1 <html> 2 <head> 3 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 4 <%@ include file="top.jsp"%> 5

基于JSP+Serlvet+JDBC的开发(3)-- Service、DAO层实现

这里为了使不必在所有Service和DAO都写基础的增删查改,我写了两个基类接口,BaseService和BaseDAO BaseDAO.java (这里使用了泛型,PK 是主键,T是实体类型),这样其他DAO只要继承这个DAO就可以实现基础增删查改了. 1 package dao; 2 3 import java.io.Serializable; 4 import java.util.List; 5 6 /* 7 * 所有DAO接口继承此接口获取基本的增删查改规范 8 */ 9 public

基于JSP的病历管理系统开发与设计,源码下载

大家好,我是全微毕设团队的创始人,本团队擅长JAVA(SSM,SSH,SPRINGBOOT).PYTHON.PHP.C#.安卓等多项技术. 今天将为大家分析一个病历管理系统(指出传统病案管理模式存在的问题,从新旧病案归档整理.电子病案的使用等方面介绍电子病案管理系统的实施,阐明实施电子病案管理的意义,包括节省存储空间,提高检索效率.病案质量与规范管理等.),该项目使用框架为SSM(MYECLIPSE),选用开发工具为MYECLIPSE.病历管理系统为一个 后台项目. 为了完成该系统,我们首先需要

基于VS2013的应用程序开发--Combo Box类

1.判断是否为空 m_CheckPoint.GetCurSel()==-1; 2.清空 m_CheckPoint.ResetContent(); 3.添加 m_CheckPoint.AddString(str); 4.获取某一索引的值 m_CheckPoint.GetLBText(j,str1);//j为索引,str1为存储变量 5.删除某一索引的值 m_CheckPoint.DeleteString(j);//j为索引 6.获得combox选中的值 m_CheckPoint.GetLBText

基于jsp的AJAX多文件上传的实现

最近的项目开发中,遇到了一个多文件上传的问题,即在不刷新页面的情况下,上传多个文件至服务器.现总结分享如下: 本文主要采用了基于jsp的ajax,jquery,servlet等技术. 1.upload.jsp 点击上传时,调用对应的fileupload函数,通过ajax将文件异步传送到servlet中处理.注意在文件上载时,所使用的编码类型应当是"multipart/form-data",它既可以发送文本数据,也支持二进制数据上载. <%@ page language="

JSP+Struts2+JDBC+Mysql实现的校园宿舍管理系统

项目简介 项目来源于:https://gitee.com/passenger134/javaweb-sushe 本系统基于JSP+Struts2+JDBC+Mysql的校园宿舍管理系统.该系统没有使用全套的SSH框架,只使用了跳转层Struts2,非常适合学习Struts2时使用. 难度等级:中等 技术栈 编辑器 Eclipse Version: 2019-12 (4.14.0) 前端技术 基础:html+css+JavaScript 框架:无 后端技术 JSP+Struts2+JDBC 数据库

基于Servlet、JSP、JDBC、MySQL的一个简单的用户注冊模块(附完整源代码)

近期看老罗视频,做了一个简单的用户注冊系统.用户通过网页(JSP)输入用户名.真名和password,Servlet接收后通过JDBC将信息保存到MySQL中.尽管是个简单的不能再简单的东西,但麻雀虽小,五脏俱全,在此做一归纳和整理.以下先上源代码: 一.index.jsp <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% String