开门见山
我先和大家唠两句嗑,要到秋天了,天气改转凉了。可神特喵的天气 29度,29度啊大哥,和大夏天有啥子区别,这谁顶得住!【来自怕热星人的碎碎念】
Servlet 是运行于 Web 服务器端的 Java 程序。在 Web 开发中,Servlet 常用于在服务器端处理一些与界面无关的任务。
例如,客户端请求数据的处理、HTTP 请求报头和响应报头的处理、请求链的传递和转向控制等。
今天来详细的说说,Servlet 应用,学东西起码要知道是做什么用的
教学内容:
一、数据处理
二、重定向与请求转发
一、数据处理
在 Web 应用中,客户端向服务端请求数据的方式通常有两种:
· 一种是通过超链接形式查询数据
· 另一种是通过 From 表单形式更新数据
对于这两种不同的数据请求方式,Servlet 使用 HttoServletRequest 接口负责对其请求的数据进行处理
1)处理超链接请求数据
【语法】
【代码】link.jsp
【运行结果】
【程序说明】
LinkRequestServlet:链接地址中的 LinkRequestServlet 为请求地址;
pageNo:pageNo 表示请求参数
2:2 为 pageNo 请求参数的值
&:&为多个参数间的关联符
queryString:queryString 表示另一个请求参数
QST:QST为 queryString 请求参数的值
当用户通过超链接发送的请求到达 Servlet 容器时,包含数据的请求将被容器转换为 ServletRequest 对象,如果用户请求使用的是 HTTP 协议,请求还将被进一步包装成 HttpServletRequest 对象。对请求数据的处理工作就由 HttpServletRequest 对象完成
HttpServletRequest 对象常用的数据处理方法:
· public String getParameter(String name) 返回由 name 指定的用户请求参数的值
· public String[] getParameterValues(String name) 返回由 name 指定的一组用户请求参数的值
· public Enumeration getParameterNames() 返回所有客户请求的参数名
容器在将请求转换为 HttpServletRequest 对象之后,还会根据请求的类型调用不同的请求方法。
对用超链接的 GET 请求则会调用 doGet() 方法;对于 From 表单的 POST 请求则会调用 doPost() 方法。
HttpServletRequest 对象的超链接数据请求处理代码
【代码】LinkRequestServlet.java
【运行结果】
2)处理 Form 表单请求数据
通过 Form 表单形式发送数据请求的语法格式
【语法】
【代码】regist.jsp
【运行结果】
From 表单中的 method 属性表示请求类型,取值包括为 GET 和 POST。
GET 一般用于资源信息获取或查询;POST 则一般用于资源信息更新。
无论是基于安全性的考虑还是传输数据大小的限制,POST 都要好于 GET,一般在 Form 表单使用中请求多用 POST
From 表单中 action=“FormRequestServlet” , FormRequestServlet 对请求参数的处理代码
【代码】FormRequestServlet.java
【运行结果】在 regist.jsp 运行结果中,点击提交表单
总结一下,对于Servlet对于数据的处理有两种,
分别是 标签的超链接请求数据的处理,属性名为 href;和表单请求数据,属性名为 action。
直观感觉看起来东西挺多,其实还真没什么。
代码奉上:
【link.jsp】
<%@page language="java" contentType="text/html; charest=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>
<a href="LinkRequestServlet?pageNo=2&queryString=QST">下一页</a>
</body>
</html>
【regist.jsp】
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>用户注册</title>
</head>
<body>
<form action="FromRequestServlet" 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="Friend">亲友</p>
<p><input type="submit" value="提交"/><input type="reset" value="重置"/></p>
</form>
</body>
</html>
【LinkRequestServlet.java】
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/LinkRequestServlet")
public class LinkRequestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public LinkRequestServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置请求的字符编码为 UTF-8
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);
//响应输出数据
out.println("<p>请求的页数是:"+pageNum+"</p>");
out.println("<p>请求的查询字符是:"+queryString+"</p>");
out.flush();
out.close();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
【FromRequestServlet.java】
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
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 FromRequestServlet
*/
@WebServlet("/FromRequestServlet")
public class FromRequestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public FromRequestServlet() {
super();
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置响应的文本类型为 HTML, 字符编码为 UTF-8
response.setContentType("text/html; charset=UTF-8");
//获取请求数据
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.print("<p>注册的用户名是:" + username + "</p>");
out.print("<p>注册的密码是:" + password + "</p>");
out.print("<p>注册的信息来源是:");
for(String c:channel)
out.print(c+ " ");
out.print("</p><p>所有客户请求的参数名是:");
while(elem.hasMoreElements())
out.print(elem.nextElement() + " ");
out.print("</p>");
out.flush();
out.close();
}
}