@为什么需要BaseServlet?  我们知道一个POST或者GET提交对应着一个Servlet, 无数的提交会让Servlet页面增加,我们希望一个Servlet就能处理很多提交的请求。

@BaseServlet 是一个继承了HttpServlet的普通类,并不是Servlet类,所以不需要在web.xml中添加路径。但是Servlet会继承这个BaseServlet来实现一个Servlet处理多个提交请求 。

@一些要求 是: 客户端发送请求时,必须提供一个参数(本文编写的这个参数名字叫method,这个method和form中的那个method没有半毛钱关系,只是一个变量名字而已),用来说明要调用Servlet中的那个处理方法; 其次,继承了BaseServlet的Servlet中的处理请求的方法的原型必须与service方法相同,即返回值类型、参数都不需要和service方法相同。即如下的形式:

 public String XXX(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException { return null ;
}

@POST和GET请求对于method参数的提供技巧 POST请求一般为表单形式,提供method参数的方式可以添加一个隐藏字段 <input type="hidden" name="method" value="希望调用Servlet中的方法的名字"/>  ; @GET请求一般为超链接,提供method参数的方式直接在路径后面加 ?method=方法名

@POST和GET请求编码处理 我们知道Servlet对POST请求和对GET请求的请求编码不同,区别如下:

POST的请求
request.setCharacterEncoding("utf-8");
String name = request.getParameter("name");
GET的请求
String name = request.getParameter("name");
name = new String(name.getBytes("ISO-8859-1"),"utf-8");
POST和GET的响应编码都是:
response.setContentType("text/html;charset=UTF-8");

为了使得servlet中的代码简洁,我们可以把两种编码的代码放到BaseServlet中,但是,像上传下载这种请求不适合用BaseServlet,所以我们一般把这种代码写在过滤器中,过滤器不是本文主要内容,如果你不会的话,可以不用过滤器,把编码的代码直接写在servlet中的请求处理方法中即可 。

@源码

 <%--get请求,传递过去method参数,指明调用TestServlet的fun2方法,并且传递一个参数param--%>
<a href="<c:url value='/TestServlet?method=fun2&param=哈哈'/>"> 点击这里啊</a>
<%--post请求--%>
<form action="<c:url value='/TestServlet'/>" method="post">
<input type="hidden" name="method" value="fun1"/>
<input type="text" name="param" value="我是表单参数" />
<input type="submit" name="提交"/>
</form>

请求jsp页面

 package cn.demo1.baseServlet;

 import java.io.IOException;

 import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* TestServlet
* 实现了一个Servlet中多个请求处理方法
* 方法的的参数必须和service方法相同
* 客户端必须传递过来method参数,说明是调用哪一个请求处理方法
* @author ZHAOYUQIANG
*
*/
public class TestServlet extends BaseServlet {
/**
* 测试post传递过来的参数
* @param request
* @param response
* @return
* @throws ServletException
* @throws IOException
*/
public String fun1(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String param = request.getParameter("param");
request.setAttribute("param", param);
return "f:/baseServlet/index.jsp" ;
}
/**
* 测试get请求传递过来的参数
* @param req
* @param resp
* @return
* @throws ServletException
* @throws IOException
*/
public String fun2(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String param = request.getParameter("param");
request.setAttribute("param", param);
return "f:/baseServlet/index.jsp";
}
}

请求Servlet

 package cn.demo1.baseServlet;

 import java.io.IOException;
import java.lang.reflect.Method; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* BaseServlet[抽象类] 不需要在web.xml中添加路径
* @功能 1.
* @author ZHAOYUQIANG
*
*/
public abstract class BaseServlet extends HttpServlet {
public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// response.setContentType("text/html;charset=UTF-8");//处理响应编码
/*
* 设置POST和GET请求编码
*/
/*
* 1. 获取参数,用来识别用户想请求的方法
* method是用户在浏览器地址栏中输入的想要调用的方法,是个参数
*/
String methodName = request.getParameter("method");
/*
* 2. 判断用户有没有传参数
*/
if(methodName == null || methodName.trim().isEmpty()){
throw new RuntimeException("您没有传递method参数! 无法确定您要调用的方法!");
}
/**
* 3. 判断是哪一个方法,是哪一个就调用哪一个
* 所用的技术是: 反射
* 需要得到本类Class,然后调用它的getMethod,通过传递过来的方法名字进行得到Method对象
* 这样做的目的是: 以后像其他Servlet中的方法要修改或者添加新方法时,就不用在去修改这一块代码了
*/
/*
* 3.1. 得到当前类的对象
*/
Class c = this.getClass();
/*
* 3.2. 通过传递过来的方法名(addUse等)得到Method对象
* 导包 :java.lang.reflect.Method;
*/
Method method = null ;
try {
method = c.getMethod(methodName,
HttpServletRequest.class,HttpServletResponse.class);
} catch (Exception e) {
throw new RuntimeException("您要调用的方法"+methodName+",它不存在");
}
try {
/*
* 3.3. 调用method表示的方法,即: 调用继承该类的类中的方法
* 反射调用: 用this来调用method表示的方法,并且传递参数req和resp
*/
String result =(String)method.invoke(this, request,response);
/**
* 4. 处理从继承这个类的类中返回的字符串(重定向和转发)
* return "r:/index.jsp"; 和 return "f:/index.jsp";
* 返回的是字符串,需要解读字符串
*/
/*
* 4.1. 如果用户返回的字符串为null,或者"",那么什么都不做
*/
if(result == null || result.trim().isEmpty()){
return ;
}
/*
* 4.2. 解读字符串1:判断字符串中有没有冒号
* 没有冒号默认表示转发,反之再进行判断
*/
if(result.contains(":")){
/*
* 4.3. 解读字符串2 : 先获取冒号位置,然后截取前缀(操作,是重定向还是转发)和后缀(路径)
*/
int index = result.indexOf(":");
String operate = result.substring(0,index);
String path = result.substring(index+1);
/*
* 4.4. 进行处理,如果是r重定向,如果是f则转发
*/
if(operate.equalsIgnoreCase("r")){
response.sendRedirect(request.getContextPath()+path);
}else if(operate.equalsIgnoreCase("f")){
request.getRequestDispatcher(path).forward(request, response);
}else{
throw new RuntimeException("您指定的操作"+operate+
"不支持,请正确填写:r和f");
}
}else{
/*
* 没有冒号默认转发处理
*/
request.getRequestDispatcher(result).forward(request, response);
}
} catch (Exception e) {
System.out.println("您要调用的方法"+methodName+",它内部抛出了异常");
throw new RuntimeException(e);
}
}
}

BaseServlet

 package cn.demo1.baseServlet;

 import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest; /**
* 辅助Servlet简化编码代码
*/
public class EncodingFilter implements Filter { public void destroy() {
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
/*
* 处理post请求乱码问题
*/
request.setCharacterEncoding("utf-8");
/*
* 处理GET请求编码问题
* String name1 = request.getParameter("name");
* name2 = new String(name.getBytes("ISO-8859-1"),"utf-8");
* GET不一样,设置编码后,servlet中获取name,获取应该是name2,都是如果如上写的话,
* getParameter("name")获取的是name1 .
* 掉包request
* 1. 写一个request的装饰类
* 2. 放行时,使用我们自己的request
* 3. 但是POST方式依然使用request
*/
HttpServletRequest req = (HttpServletRequest) request ;
if(req.getMethod().equals("GET")){
EncodingRequest er = new EncodingRequest(req);
chain.doFilter(er, response);
}else if(req.getMethod().equals("POST")){
chain.doFilter(request, response);
}
response.setContentType("text/html;charset=UTF-8");
} public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
} }

EncodingFilter类

package cn.demo1.baseServlet;

import java.io.UnsupportedEncodingException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
/**
* 辅助过滤器来处理GET编码问题
* @author ZHAOYUQIANG
*
*/
public class EncodingRequest extends HttpServletRequestWrapper{
private HttpServletRequest request ; public EncodingRequest(HttpServletRequest request) {
super(request);
this.request = request ;
}
/**
* 处理编码问题
*/
public String getParameter(String name) {
String value = request.getParameter(name);
/*
* 处理编码问题
*/
try {
value = new String (value.getBytes("ISO-8859-1"),"utf-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
throw new RuntimeException(e);
} return value;
} }

EncodingRequest类

 <filter>
<display-name>EncodingFilter</display-name>
<filter-name>EncodingFilter</filter-name>
<filter-class>cn.demo1.baseServlet.EncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/TestServlet</url-pattern>
</filter-mapping>

过滤器的拦截配置

@项目下载

http://files.cnblogs.com/files/zyuqiang/webBlogTest.rar

《JavaWeb从入门到改行》关于BaseServlet那些事的更多相关文章

  1. 《JavaWeb从入门到改行》过滤器学习笔记

    >"; display: block; height: 0; clear: both; visibility: hidden; } #sitemap, #sitemap ul{disp ...

  2. 《JavaWeb从入门到改行》注册时向指定邮箱发送邮件激活

    javaMail API javaMail是SUN公司提供的针对邮件的API . 两个jar包  mail.jar 和 activation.jar java mail中主要类:javax.mail. ...

  3. 《JavaWeb从入门到改行》多重外键关系在java中的处理方案

    目录:(点击红色方框展开子目录) 问题描述 无 项目案例说明 业务描述 数据库说明 项目源码及下载 无 问题描述 如上两图,数据库中各个表之间有很多的外键关系,其中业务关系是一个用户下有该用户的订单, ...

  4. 《JavaWeb从入门到改行》分页功能的实现

    @目录 什么是分页 ? 两个子模块功能的问题分析 和 解决方案 有条件查和无条件查询的影响 和 解决方案 项目案例: mysql + commons-dbutils+itcast-tools+Base ...

  5. 《JavaWeb从入门到改行》JSP+EL+JSTL大杂烩汤

    title: Servlet之JSP tags: [] notebook: javaWEB --- JSP是什么 ? JSP就是Servlet,全名是"JavaServer Pages&qu ...

  6. 《JavaWeb从入门到改行》那些年一起学习的Servlet

    目录 获取ServletContext : ServletContext接口中的一些方法 application域存取数据功能 代码演示: application域获取项目文件路径 代码演示: API ...

  7. 《JavaWeb从入门到改行》JDBC经典秘方QueryRunner

    目录: 基础篇_功能各自回顾 JDBC基础代码回顾(使用JdbcUtils工具简化) c3p0数据库连接池的使用(使用JdbcUtils工具简化) 大数据的插入(使用c3p0+JdbcUtils工具简 ...

  8. 《JavaWeb从入门到改行》fileupload,没毛病

    目录: »  fileupload API >  文件上传的要求 >  fileupload组件 »  上传细节的代码演示 »  项目案例-上传头像并显示 fileupload API 文 ...

  9. 《JavaWeb从入门到改行》很好的复习资料: SQL语句到底怎么写 ?

    本文用到的数据库如下: CREATE DATABASE exam; /创建部门表/ CREATE TABLE dept( deptno INT PRIMARY KEY, dname ), loc ) ...

随机推荐

  1. canvas绘制五角星详细过程

    canvas绘制 <canvas id="straight"></canvas> <script> var canvas = document. ...

  2. navicat for oracle 创建表ID字段的自动递增

    Oracle数据库创建表ID字段的自动递增   将表t_uaer的字段ID设置为自增:(用序列sequence的方法来实现) ----创建表 Create table t_user( Id numbe ...

  3. .NET Core容器化之多容器应用部署-使用Docker-Compose

    原文补充: -- docker-compose.ymlversion: ' services: mvc-web: container_name: mvc.web.compose build: . re ...

  4. 12个值得关注的顶级可视化JS库 涉及图表、动画、时间处理,表格操作

    本文是译文,原文是https://da-14.com/blog/top-11...我在原文的基础上加了百度的Echats图表库,这个也是毫不逊色其他图表库的.另外Handsontable电子表格库也是 ...

  5. JS使用Crypto实现AES/ECS/zero-padding加密

    首先说一句,no-padding和zero-padding是一样的.他们指的是不够16位的情况补0至16位. 天知道网上为什么会出现两种叫法. 另附两个有用的网址 http://tool.chacuo ...

  6. Hibernate 查询数据库中的数据

    1.Criteria介绍 Criteria与Session绑定,其生命周期跟随着Session结束而结束,使用Criteria时进行查询时,每次都要于执行时期动态建立物件,并加入各种查询条件,随着Se ...

  7. 【学习小记】KD-Tree

    Preface 听说KD树实在是个大神器 可以解决多维空间多维偏序点权和,可以求某个点的空间最近最远点 就二维平面上的来说,复杂度在\(O(n\log n)\)到\(O(n\sqrt n)\)不等 嫌 ...

  8. 基于Anaconda 安装 geatpy 和 tensorflow

    装了好久的第三方包终于成功了,暴风哭泣!!!总结一下 分两部分说: 一. 首先是在本地电脑windows系统下装: 首先安利一下这个包括各种 Genetic and Evolutionary Algo ...

  9. 博客主题皮肤探索-添加新功能和fiddler的css/js替换

    还有前言 使用了主题之后,发现还差了一点功能.最新评论没有了,导致读者回复需要一点时间去找到底回复了哪条博客.于是就有了添加功能的想法. 如何调试CSS/JS 打开f12,可以看见加载的js资源都是混 ...

  10. 模块和处理程序之通过HttpModule和HttpHandler拦截入站HTTP请求执行指定托管代码模块

    1.简介 大多数情况下,作为一个asp.net web开发对整个web应用程序的控制是十分有限的,我们的控制往往只能做到对应用程序(高层面)的基本控制.但是,很多时候,我们需要能够低级层面进行交互,例 ...