一、数据处理
在Web服务器中,客户端向服务器请求数据的方式有两种:超链接、form表单。
对于这两种不同的数据请求方式,Servlet使用HttpServletRequest接口负责进行处理。
二、超链接与Form表单
1. 超链接
语法:<a href=“URL地址?参数1 & 参数2 & …”>
URL是请求地址,后面参数是请求传入的参数,可以使用getParameeter()进行获取。
实例
Link.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
/*LinkRequestServlet是请求地址,URL地址,在这里是创建的类名,即调用该函数*/
<a href="LinkRequestServlet?pageNO=2&queryString=QST">下一页</a>
</body>
</html>
LinkRequest.java
package chapter01.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class LinkRequestServlet
*/
@WebServlet("/LinkRequestServlet")
public class LinkRequestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public LinkRequestServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see Servlet#init(ServletConfig)
*/
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
System.out.println(this.getClass().getName() + "的init()方法被调用");
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置请求的字符编码
request.setCharacterEncoding("UTF-8");
// 设置响应的文本类型是HTML,字符编码是UTF-8
response.setContentType("text/html; charset=UTF-8");
// 获取输出流
PrintWriter out = response.getWriter();
// 获取请求数据
String pageNO = request.getParameter("pageNO");
String queryString = request.getParameter("queryString");
int pageNum = 0;
if(pageNO != null)
pageNum = Integer.parseInt(pageNO);
System.out.println(pageNum);
out.println("<p>请求的页数是:"+ pageNum +"</p>");
out.println("<p>请求查询的字符是:" + queryString + "</p>");
out.flush();
out.close();
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
2.Form表单
语法:和HTML中的form一样
实例
regist.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
// 使用form表单处理数据请求
<form action="FormRequestServlet" method="POST">
<p>用户名 <input name="username" type="text"></p>
<p>密 码 <input name="password" type="password"><p>
<p>信息来源:
<input name="channel" type="checkbox" value="web">网络
<input name="channel" type="checkbox" value="newspaper">报纸
<input name="channel" type="checkbox" value="tv">电视
<input name="channel" type="checkbox" value="kins">亲友
</p>
<p>
<input type="submit" value="提交">
<input type="submit" value="重置">
</p>
</form>
</body>
</html>
FormRequestServlet.java
package chapter01.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class FormRequestServlet
*/
@WebServlet("/FormRequestServlet")
public class FormRequestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public FormRequestServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see Servlet#init(ServletConfig)
*/
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
System.out.println(this.getClass().getName() + "的init()方法被调用");
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置请求的字符编码
request.setCharacterEncoding("utf-8");
// 设置响应的文本类型是HTML,字符编码是UTF-8
response.setContentType("text/html; charset=utf-8");
response.setCharacterEncoding("utf-8");
// 通过标签的name属性获取数据
String username = request.getParameter("username");
String password = request.getParameter("password");
String[] channel = request.getParameterValues("channel");
Enumeration <String> elem = request.getParameterNames();
// 获取输出流
PrintWriter out = response.getWriter();
out.println("<head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"></head>");
out.println("<p> 注册的用户名是:" + username + "</p>");
out.println("<p> 注册的密码是:" + password + "</p>");
out.println("<p> 注册的信息来源是:");
for(String c:channel) {
out.println(c + " ");
}
out.println("</p><p> 所有用户的请求参数为:");
while(elem.hasMoreElements()) {
out.println(elem.nextElement() + " ");
}
out.println("</p>");
out.flush();
out.close();
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
三、总结与二者比较
- 超链接一般用于获取/查询资源信息,属于get请求类型,请求的数据附加在URL地址后,由于长度限制一般只传输简单的数据
- Form表单一般用于更新资源信息,默认使用get请求方法,大多使用post请求,理论上没有大小限制,可以传输大量数据。