图书商城中的UserServlet中的继承的BaseServlet的原理

1、regist.jsp中传递隐藏字段”method“,方法名为“regist”

<form action="<c:url value='/UserServlet'/>" method="post">

<input type="hidden" name="method" value="regist"/>
用户名:<input type="text" name="username" value="${form.username }"/>${error.username }<br/>
密 码:<input type="password" name="password" value="${form.password }"/>${error.password }<br/>
邮 箱:<input type="text" name="email" value="${form.email }"/>${error.email }<br/>
<input type="submit" value="注册"/>

</form>

2、BaseServlet继承HttpServlet并且获得参数“method”,即方法名

String methodName = request.getParameter("method");
Method method = null;

3、通过方法名,利用反射执行本方法。

try {
method = this.getClass().getMethod(methodName,
HttpServletRequest.class, HttpServletResponse.class);
} catch (Exception e) {
throw new RuntimeException("您要调用的方法:" + methodName + "它不存在!", e);
}

/**
* 3. 通过method对象来调用它
*/

String result = (String)method.invoke(this, request, response);//其中this代表UserServlet

if(result != null && !result.trim().isEmpty()) {//如果请求处理方法返回不为空
int index = result.indexOf(":");//获取第一个冒号的位置
if(index == -1) {//如果没有冒号,使用转发
request.getRequestDispatcher(result).forward(request, response);
} else {//如果存在冒号
String start = result.substring(0, index);//分割出前缀
String path = result.substring(index + 1);//分割出路径
if(start.equals("f")) {//前缀为f表示转发
request.getRequestDispatcher(path).forward(request, response);
} else if(start.equals("r")) {//前缀为r表示重定向
response.sendRedirect(request.getContextPath() + path);
}
}
}

细节(1)

       response.sendRedirect("/hello/BServlet");//请求重定向要加项目名

RequestDispatcher rd =request.getRequestDispatcher("/BServlet");//请求转发不用加 

       rd.forward(request, response) ;
所以上文中response.sendRedirect(request.getContextPath() + path)句话中加入了request.getContextPath()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值