HTTP协议
GET,POST请求
- get请求的最大特点:把请求参数赋在URL后面,用问号连接
- post请求则是把请求参数放在form data(表单里)
GET
在浏览器地址栏中输入某个URL地址或单机网页上的一个超链接,浏览器发出HTTP请求消息的请求方式为GET.
POST
POST请求方式主要用于向WEB服务器端程序提交form表单中的数据(form表单中的method置为POST)
如何在servlet中获取请求信息
1)、Servlet的service()方法用于应答请求。因为每次请求都会调用service()方法
- ServletRequest:封装了请求信息
- ServletResponse:封装了响应信息
这两个接口的实现类都是服务器给予实现的,并在调用service方法时传入。
2)、ServletRequest:
获取请求参数:
- String getParameter(String name):根据请求参数的名字,返回参数值。
若请求参数有多个值(如:checkbox),该方法只能获取到一个值 - String [] getParameterValues(String name):根据请求参数的名字,返回请求参数对应的字符串数组
- Enumeration getParameterNames():返回参数名对应的Enumeration对象。类似于ServletConfig(或ServletContext)的getInitParamterNames()方法。
- Map getParameterMap(): 返回请求参数的键值对
代码演示:
@Override
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
System.out.println("请求来了...");
String user = request.getParameter("user");
String password = request.getParameter("password");
System.out.println(user + ":" + password);
String[] interestings = request.getParameterValues("interesting");
for (String interest : interestings) {
System.out.println(interest);
}
Enumeration<String> names = request.getParameterNames();
while (names.hasMoreElements()){
String name = names.nextElement();
String val = request.getParameter(name);
System.out.println("^^"+name+":"+val);
}
Map<String,String[]> map = request.getParameterMap();
for (Map.Entry<String,String[]> entry:map.entrySet()){
System.out.println("**"+entry.getKey()+":"+ Arrays.asList(entry.getValue()));
}
}
3) ServletResponse
封装了响应信息,如果想给用户什么响应,具体可以使用该接口的方法实现。
-
getWriter():返回PrinterWriter对象。调用该对象的print()方法,将把print()中的参数直接打印到客户端浏览器上。
-
设置响应的内容类型 :response.setContentType(“application/msword”);
-
void sendRedirect(String location):请求的重定向(此方法为HttpServletResponse 中定义)
4)GenericServlet
-
1、是一个Servlet,是Servlet和ServletConfig接口的实现类。但是一个抽象类。其中的service方法为抽象方法
-
2、如果新建的Servlet程序直接继承GenericServlet会使开发更加简便
-
3、具体实现:
- 1、在 GenericServlet 中声明一个ServletConfig 类型的成员变量,在init(ServletConfig) 方法中对其进行初始化
- 2、利用servletConfig成员变量的方法实现了 ServletConfig接口的方法
- 3、定义了一个init()方法,在init(ServeltConfig)方法对其进行调用,子类可直接覆盖init()在其中实现对Servlet的初始化。
- 4、不建议直接覆盖init(ServletConfig),因为如果忘记编写super(ServletConfig),而还是用ServletConfig接口的方法,会出现空指针异常。
- 5、新建的init(){}并非Servlet的生命周期方法,而是init(ServletConfig)是生命周期相关的方法。
-
4、示例代码如下:
public abstract class MyGenericServlet implements Servlet, ServletConfig {
/**
* 一下方法为Servlet接口的方法
**/
private ServletConfig servletConfig;
@Override
public void init(ServletConfig servletConfig) throws ServletException {
this.servletConfig = servletConfig;
}
@Override
public ServletConfig getServletConfig() {
return servletConfig;
}
@Override
public abstract void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException;
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
/**
* 一下方法为ServletConfig接口的方法
**/
@Override
public String getServletName() {
return servletConfig.getServletName();
}
@Override
public ServletContext getServletContext() {
return servletConfig.getServletContext();
}
@Override
public String getInitParameter(String s) {
return servletConfig.getInitParameter(s);
}
@Override
public Enumeration<String> getInitParameterNames() {
return servletConfig.getInitParameterNames();
}
}
5)HttpServlet
- 1、是一个Servlet,继承于GenericServlet,针对HTTP协议所制定
- 2、在 service()方法中直接把
ServletRequest
和ServletResponse
强转为HttpServletRequest
和HttpServletResponse
。并调用了重载的service(HttpServletRequest,HttpServletResponse)
- 3、在
service(HttpServletRequest,HttpServletResponse)
中获取请求方式:request.getMethod()
。根据请求方式创建了doxxx()
方法(xxx为具体请求方式)
*代码示例:
@Override
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
HttpServletRequest request;
HttpServletResponse response;
try {
request = (HttpServletRequest) req;
response = (HttpServletResponse) res;
} catch (ClassCastException e) {
throw new ServletException("non-HTTP request or response");
}
service(request,response);
}
public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1、获取请求方式
String method = request.getMethod();
//2、根据请求方式调用处理方法
if ("GET".equalsIgnoreCase(method)) {
doGet(request, response);
} else if ("POST".equalsIgnoreCase(method)) {
doPost(request, response);
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
- 4、实际开发中,直接继承HttpServlet,并根据请求方式复写doxxx()方法接口。
- 5、好处:直接有针对性的覆盖doxxx()方法,直接使用HttpServletRequest和HttpServletResponse,不需要进行强转。