genericServlet采用的缺省适配器设计模式。对Servlet接口中的大部分方法进行了空实现,service方法为抽象方法,留给子类实现
init部分采用了模板方法设计模式,init()给子类实现
实现ServletConfig接口方法,简化子类中关于servletConfig的相关代码
public abstract class GenericServlet implements Servlet, ServletConfig, Serializable {
private transient ServletConfig config;
// 无参构造器,子类调用构造器时需要调用父类无参构造器
public GenericServlet() {
}
//空实现大部分方法,省略部分。。
public void destroy() {
}
public ServletConfig getServletConfig() {
return this.config;
}
// 为了子类可以较简便的使用Servlet中的方法
public ServletContext getServletContext() {
ServletConfig sc = this.getServletConfig();
if (sc == null) {
throw new IllegalStateException(lStrings.getString("err.servlet_config_not_initialized"));
} else {
return sc.getServletContext();
}
}
// 模板方法设计模式
public void init(ServletConfig config) throws ServletException {
this.config = config;
this.init();
}
//子类覆写
public void init() throws ServletException {
}
//留给子类实现
public abstract void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
}
继承于GenericServlet,重写service方法,分别get、post等各种网络请求。子类可以重写doGet、doPost方法实现相关需求。
public abstract class HttpServlet extends GenericServlet{
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
HttpServletRequest request;
HttpServletResponse response;
try {
request = (HttpServletRequest)req;
response = (HttpServletResponse)res;
} catch (ClassCastException var6) {
throw new ServletException("non-HTTP request or response");
}
this.service(request, response);
}
//处理各种网络请求
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String method = req.getMethod();
long lastModified;
if (method.equals("GET")) {
lastModified = this.getLastModified(req);
if (lastModified == -1L) {
this.doGet(req, resp);
} else {
long ifModifiedSince = req.getDateHeader("If-Modified-Since");
if (ifModifiedSince < lastModified / 1000L * 1000L) {
this.maybeSetLastModified(resp, lastModified);
this.doGet(req, resp);
} else {
resp.setStatus(304);
}
}
}
···········
}
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String protocol = req.getProtocol();
String msg = lStrings.getString("http.method_get_not_supported");
if (protocol.endsWith("1.1")) {
resp.sendError(405, msg);
} else {
resp.sendError(400, msg);
}
}
··········省略··········
}
HttpServletRequest对于请求中所携带的参数是以Map的形式接收的,并且该Map的key为String,value为String数组。
1.请求方式
getMethod()方法获取用户请求的方式
2.获取请求参数值
getParameter(String name) //根据提供的字符串序列参数获取用户请求中的对应参数值。
getParameterMap()//返回用户请求中的请求参数和请求参数值组成的键值对序列。(返回的是Map对象)
getParameterNames()//返回用户请求中的请求参数序列。
getParameterValues(String name)//方法返回指定请求参数对应的参数值序列(用于复选框)
3.获取域属性
void removeAttribute(String name)
void setAttribute(String name,Object o)
obejct getAttribute(String name)
4.服务端相关方法
StringBuffer getRequestURL();//获取客户端访问服务器时请求的url路径
String getContextPath();//获取当前Web应用的根路径:(即:/ +项目名)
String String getRemoteAddr();//获取客户端IP
String getServletPath();//返回的是路径的精确部分(如果没有非精确部分(通配符部分),则是中的全部内容)
String getPathInfo();//非精确部分,即地址栏上与匹配之外的额外的部分(如果不存在,则为null
1、解决get请求
在Tomcat安装根目录的conf目录下的server.xml文件的标签中添加URIEncoding=“UTF-8”
2、get和post请求都可以解决
将请求参数值字符串使用getBytes(String charsetName)方法
String name = request.getParameter("name");
byte[] bytes = name.getBytes("ISO8859-1");
name = new String(bytes, "UTF-8");
Web服务器收到一个Http请求后,会针对每个请求创建一个HttpServletRequest对象和HttpServletResponse对象。若需要获取客户端提交请求的相关信息,则需要从HttpServletRequest对象中获取;若需要向客户端发送数据,则需要通过HttpSerlvetResponse对象来完成。
PrintWriter getWriter() //返回一个标准输出流对象,用于向客户端中输出字符数据
请求转发和重定向的选择问题:
//获取RequestDispather接口的实现类对象,forward为RequestDispatcher接口中方法
RequestDispatcher getRequestDispatcher(String path)
void forward(ServletRequest request, ServletResponse response)//转发一个请求从一个servlet到服务器中的另外一个资源(包括servlet,JSP文件或者HTML文件)
void sendRedirect(java.lang.String location)//请求的重定向:使用指定url路径为客户端发送一个临时的重定向响应(以此清空缓存)