如何实现一个Servlet中的多个功能

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何实现一个Servlet中的多个功能相关的知识,希望对你有一定的参考价值。

前言:

唉,打脸了,前脚刚说过要跟Servlet正式告别,后脚这不又来了,哈哈,总结出一点东西,纠结了一下还是做个分享吧,学习知识比面子重要,对吧。

需求分析

看下面代码,现在有一个UserServlet,里面有增删改查四个方法,按平常的思维,用一个Servlet实现一个功能,这没毛病,现在问题是一个Servlet中有四个功能,那这该如何去实现呢?

package
 com.my.servlet;

import
 com.my.service.
UserService
;

import
 com.my.service.impl.
UserServiceImpl
;

import
 javax.servlet.annotation.
WebServlet
;

import
 javax.servlet.http.
HttpServlet
;

import
 javax.servlet.http.
HttpServletRequest
;

import
 javax.servlet.http.
HttpServletResponse
;

@WebServlet
(
"/user"
)

public

class

UserServlet

extends

HttpServlet
 {

private

UserService
 userService = 
new

UserServiceImpl
();

public

String
 add(
HttpServletRequest
 request,
HttpServletResponse
 response){

     userService.add();

     request.setAttribute(
"mess"
,
"添加成功"
);

return

"r:add.jsp"
;

 }

public

String

delete
(
HttpServletRequest
 request,
HttpServletResponse
 response){

       userService.
delete
();

       request.setAttribute(
"mess"
,
"删除成功"
);

return

"f:add.jsp"
;

   }

public

String
 update(
HttpServletRequest
 request,
HttpServletResponse
 response){

       userService.update();

       request.setAttribute(
"mess"
,
"修改成功"
);

return

"add.jsp"
;

   }

public

String
 query(
HttpServletRequest
 request,
HttpServletResponse
 response){

       userService.query();

       request.setAttribute(
"mess"
,
"查询成功"
);

return

"add.jsp"
;

   }

}

解决思维

解决这个问题其实也简单,再写一个FatherServlet继承于HttpServlet,在这个父类Servlet中的service()方法中通过请求参数判断要调用的子类UserServlet中的哪个方法并执行,可能说到这有些朋友不懂了,如何用参数去判断大家一看下面的代码就明白了,我主要解释一下大家的疑惑,子类UserServlet如何去调用父类FatherServlet中的service()方法,其实秘诀就在这个参数上,在访问UserSerlvet时带上请求参数,访问过来后UserServlet中没有解决参数的方法,所以他会在父类FatherServlet中寻找响应的方法,找到后执行,这是继承的,子类继承父类的方法没毛病吧,所以就解决了。

解决完这个问题后我还在service()方法中加了判断是重定向还是转发的思维,这个就友情赠送了,不说了,来,看代码:

FatherServlet:

package
 com.my.servlet;

import
 javax.servlet.
ServletException
;

import
 javax.servlet.http.
HttpServlet
;

import
 javax.servlet.http.
HttpServletRequest
;

import
 javax.servlet.http.
HttpServletResponse
;

import
 java.io.
IOException
;

import
 java.lang.reflect.
InvocationTargetException
;

import
 java.lang.reflect.
Method
;

public

class

FatherServlet

extends

HttpServlet
 {

@Override

protected

void
 service(
HttpServletRequest
 req, 
HttpServletResponse
 resp) 
throws

ServletException
, 
IOException
 {

String
 m = req.getParameter(
"m"
);

if
 (m==
null
||
""
.equals(m)){

throw

new

RuntimeException
(
"参数不能为空"
);

       }

Class
 c = 
this
.getClass();

try
 {

Method
 method = c.getMethod(m,
HttpServletRequest
.
class
,
HttpServletResponse
.
class
);

Object
 o =method.invoke(
this
,req,resp);

String
 rel =
String
.valueOf(o);

//判断返回值的前缀,默认转发,r:重定向  f:转发

if
 (rel.startsWith(
"r:"
)){

              rel =  rel.substring(rel.indexOf(
":"
)+
1
);

              resp.sendRedirect(rel);

           }
else

if
(rel.startsWith(
"f:"
)){

               rel = rel.substring(rel.indexOf(
":"
)+
1
);

               req.getRequestDispatcher(rel).forward(req,resp);

           }
else
 {

               req.getRequestDispatcher(rel).forward(req,resp);

           }

       } 
catch
 (
NoSuchMethodException
 e) {

throw

new

RuntimeException
(
"请求的方法不存在!!"
);

       } 
catch
 (
IllegalAccessException
 e) {

throw

new

RuntimeException
(
"请求方法执行异常!!"
);

       } 
catch
 (
InvocationTargetException
 e) {

throw

new

RuntimeException
(
"请求方法执行异常!!"
);

       }

   }

}

UserServlet:

package
 com.my.servlet;

import
 com.my.service.
UserService
;

import
 com.my.service.impl.
UserServiceImpl
;

import
 javax.servlet.annotation.
WebServlet
;

import
 javax.servlet.http.
HttpServletRequest
;

import
 javax.servlet.http.
HttpServletResponse
;

@WebServlet
(
"/user"
)

public

class

UserServlet

extends

FatherServlet
 {

private

UserService
 userService = 
new

UserServiceImpl
();

public

String
 add(
HttpServletRequest
 request,
HttpServletResponse
 response){

     userService.add();

     request.setAttribute(
"mess"
,
"添加成功"
);

return

"r:add.jsp"
;

 }

public

String

delete
(
HttpServletRequest
 request,
HttpServletResponse
 response){

       userService.
delete
();

       request.setAttribute(
"mess"
,
"删除成功"
);

return

"f:add.jsp"
;

   }

public

String
 update(
HttpServletRequest
 request,
HttpServletResponse
 response){

       userService.update();

       request.setAttribute(
"mess"
,
"修改成功"
);

return

"add.jsp"
;

   }

public

String
 query(
HttpServletRequest
 request,
HttpServletResponse
 response){

       userService.query();

       request.setAttribute(
"mess"
,
"查询成功"
);

return

"add.jsp"
;

   }

}

完整演示

此篇主要是解决题目所示的需求,先在需求解决了,做戏还要做全呢,我就把我测试的代码都整理出来,方便新手去学习。

UserDao

package
 com
.
my
.
dao
;

public

interface

UserDao

{

public

void
 add
();

public

void

delete
();

public

void
 update
();

public

void
 query
();

}

UserDaoImpl

package
 com
.
my
.
dao
.
impl
;

import
 com
.
my
.
dao
.
UserDao
;

public

class

UserDaoImpl

implements

UserDao

{

@Override

public

void
 add
()

{

System
.
out
.
println
(
"UserDao中的添加功能实现了"
);

}

@Override

public

void

delete
()

{

System
.
out
.
println
(
"UserDao中的删除功能实现了"
);

}

@Override

public

void
 update
()

{

System
.
out
.
println
(
"UserDao中的修改功能实现了"
);

}

@Override

public

void
 query
()

{

System
.
out
.
println
(
"UserDao中的查询功能实现了"
);

}

}

UserService

package
 com
.
my
.
service
;

public

interface

UserService

{

public

void
 add
();

public

void

delete
();

public

void
 update
();

public

void
 query
();

}

UserServiceImpl

package
 com
.
my
.
service
.
impl
;

import
 com
.
my
.
dao
.
UserDao
;

import
 com
.
my
.
dao
.
impl
.
UserDaoImpl
;

import
 com
.
my
.
service
.
UserService
;

public

class

UserServiceImpl

implements

UserService

{

private

UserDao
 userDao 
=

new

UserDaoImpl
();

@Override

public

void
 add
()

{

       userDao
.
add
();

}

@Override

public

void

delete
()

{

       userDao
.
delete
();

}

@Override

public

void
 update
()

{

       userDao
.
update
();

}

@Override

public

void
 query
()

{

       userDao
.
query
();

}

}

UserServlet

package
 com
.
my
.
servlet
;

import
 com
.
my
.
service
.
UserService
;

import
 com
.
my
.
service
.
impl
.
UserServiceImpl
;

import
 javax
.
servlet
.
annotation
.
WebServlet
;

import
 javax
.
servlet
.
http
.
HttpServletRequest
;

import
 javax
.
servlet
.
http
.
HttpServletResponse
;

@WebServlet
(
"/user"
)

public

class

UserServlet

extends

FatherServlet

{

private

UserService
 userService 
=

new

UserServiceImpl
();

public

String
 add
(
HttpServletRequest
 request
,
HttpServletResponse
 response
){

     userService
.
add
();

     request
.
setAttribute
(
"mess"
,
"添加成功"
);

return

"r:add.jsp"
;

}

public

String

delete
(
HttpServletRequest
 request
,
HttpServletResponse
 response
){

       userService
.
delete
();

       request
.
setAttribute
(
"mess"
,
"删除成功"
);

return

"f:add.jsp"
;

}

public

String
 update
(
HttpServletRequest
 request
,
HttpServletResponse
 response
){

       userService
.
update
();

       request
.
setAttribute
(
"mess"
,
"修改成功"
);

return

"add.jsp"
;

}

public

String
 query
(
HttpServletRequest
 request
,
HttpServletResponse
 response
){

       userService
.
query
();

       request
.
setAttribute
(
"mess"
,
"查询成功"
);

return

"add.jsp"
;

}

}

FatherServlet

package
 com
.
my
.
servlet
;

import
 javax
.
servlet
.
ServletException
;

import
 javax
.
servlet
.
http
.
HttpServlet
;

import
 javax
.
servlet
.
http
.
HttpServletRequest
;

import
 javax
.
servlet
.
http
.
HttpServletResponse
;

import
 java
.
io
.
IOException
;

import
 java
.
lang
.
reflect
.
InvocationTargetException
;

import
 java
.
lang
.
reflect
.
Method
;

public

class

FatherServlet

extends

HttpServlet

{

@Override

protected

void
 service
(
HttpServletRequest
 req
,

HttpServletResponse
 resp
)

throws

ServletException
,

IOException

{

String
 m 
=
 req
.
getParameter
(
"m"
);

if

(
m
==
null
||
""
.
equals
(
m
)){

throw

new

RuntimeException
(
"参数不能为空"
);

}

Class
 c 
=

this
.
getClass
();

try

{

Method
 method 
=
 c
.
getMethod
(
m
,
HttpServletRequest
.
class
,
HttpServletResponse
.
class
);

Object
 o 
=
method
.
invoke
(
this
,
req
,
resp
);

String
 rel 
=
String
.
valueOf
(
o
);

//判断返回值的前缀,默认转发,r:重定向  f:转发

if

(
rel
.
startsWith
(
"r:"
)){

              rel 
=
  rel
.
substring
(
rel
.
indexOf
(
":"
)+
1
);

              resp
.
sendRedirect
(
rel
);

}
else

if
(
rel
.
startsWith
(
"f:"
)){

               rel 
=
 rel
.
substring
(
rel
.
indexOf
(
":"
)+
1
);

               req
.
getRequestDispatcher
(
rel
).
forward
(
req
,
resp
);

}
else

{

               req
.
getRequestDispatcher
(
rel
).
forward
(
req
,
resp
);

}

}

catch

(
NoSuchMethodException
 e
)

{

throw

new

RuntimeException
(
"请求的方法不存在!!"
);

}

catch

(
IllegalAccessException
 e
)

{

throw

new

RuntimeException
(
"请求方法执行异常!!"
);

}

catch

(
InvocationTargetException
 e
)

{

throw

new

RuntimeException
(
"请求方法执行异常!!"
);

}

}

}

add.jsp

<%@
 page contentType
=
"text/html;charset=UTF-8"
 language
=
"java"
 isELIgnored
=
"false"
 %>

<%@
 taglib prefix
=
"c"
 uri
=
"http://java.sun.com/jsp/jstl/core"
 %>

<%@
 taglib prefix
=
"z"
 uri
=
"http://mycompany.com"
 %>

<html>

<head>

<title>
测试页面
</title>

</head>

<body>

<h1>
测试
</h1>

${mess}

</body>

</html>

测试展示

技术图片

技术图片

技术图片

技术图片

越努力越幸运

最后来点鸡汤吧,好久没说了,吃苦的年龄就不要选择安逸,别白了少年头,空悲切,人生赢在转折处,改变从现在开始,分享的越多,你的价值增值越大。

以上是关于如何实现一个Servlet中的多个功能的主要内容,如果未能解决你的问题,请参考以下文章

ASP.net MVC 代码片段问题中的 Jqgrid 实现

多个请求使用同一个Servlet

Chrome-Devtools代码片段中的多个JS库

SQLite的LIKE语句实现字符片段筛选的功能

SQLite的LIKE语句实现字符片段筛选的功能

SQLite的LIKE语句实现字符片段筛选的功能