概要
* 表单数据处理 (表单数据作为请求参数传递到服务端,在服务端通常使用请求对象的成员方法
* String getparameter(name) 获取表单数据
* String[] getParameterValues(name) 获取表单数据(文本域)
* FormServlet 读取 register.html ------页面用户传来的请求参数并显示 用户输入的信息
整体架构流程
// import --- 导包
import java.io.IOException; //输入输出异常
import java.io.PrintWriter; //字符打印流
import javax.servlet.ServletException; //异常处理
import javax.servlet.annotation.WebServlet; //网络服务器
//http超文本传输协议
import javax.servlet.http.HttpServlet; // 对象时 Servlet的核心,每当一个客户请求一个 Http Servlet对象时,该对象的 Service()方法就要被调用。
import javax.servlet.http.HttpServletRequest;//请求对象
import javax.servlet.http.HttpServletResponse;//响应对象
技术名词解释
//HttpServletRequest 获得请求对象 HttpServletResponse 获得响应对象
//doPost处理Post请求的的数据并做出响应
//网络服务器 servlet运行在web服务器上的java程序
技术细节
用户注册页面
<!DOCTYPE html>
<!-- 文档类型声明 -->
<html>
<head>
<meta charset="UTF-8">
<!-- charset字符集 -->
<title>用户注册页面</title>
</head>
<body>
<h4>用户注册页面</h4>
<!--
Attribute : action
Data Type : URI
Attribute : method
Data Type : ENUM
Default Value : get
Enumerated Values :
- get
- post -->
<!-- name:指定的控件名称
value:每个控件仅有一个value值
size:设置控件的大小
-->
<form action="register.action" method="post">
<!-- 以post的方式提交 -->
<fieldset>
<!-- 外加边框 -->
<table>
<!-- 表格 -->
<tr>
<!-- 表格行 -->
<td>用户名:</td>
<!-- 单元格 -->
<td><input type="text" name="username" size="15"></td>
<!-- 文本框 -->
</tr>
<tr>
<td>密码:</td>
<td><input type="password" name="password" size="16"></td>
<!-- 密码框 -->
</tr>
<tr>
<td>性别:</td>
<!-- 单选按钮,单选框 -->
<td><input type="radio" name="sex" value="male">男 <input
type="radio" name="sex" value="female">女</td>
</tr>
<tr>
<td>年龄:</td>
<!-- 文本框 -->
<td><input type="text" name="age" size="5"></td>
</tr>
<tr>
<td>兴趣:</td>
<!-- 多选按钮,复选框 -->
<td><input type="checkbox" name="hobby" value="read(文学)">文学
<input type="checkbox" name="hobby" value="sport(体育 )">体育
<input type="checkbox" name="hobby" value="computer(电脑)">电脑</td>
</tr>
<tr>
<td>学历:</td>
<td><select name="education">
<!-- 组合框 -->
<option value="bachelor(学士)">学士</option>
<!-- 列表框,下拉框 -->
<option value="master(硕士)">硕士</option>
<option value="doctor(博士)">博士</option>
</select></td>
</tr>
<tr>
<td>邮件地址:</td>
<td><input type="text" name="email" size="20"></td>
<!-- 文本框 -->
</tr>
<tr>
<td>简历:</td>
<td><textarea name="resume" rows="5" cols="30"></textarea></td>
<!-- 多行文本框 -->
</tr>
<tr>
<td><input type="submit" name="submit" value="提交"></td>
<!-- 按钮 -->
<td><input type="reset" name="reset" value="重置"></td>
</tr>
</table>
</fieldset>
</form>
</body>
</html>
FormServlet
//在那个包下
package com.demo;
// import --- 导包
import java.io.IOException; //输入输出异常
import java.io.PrintWriter; //字符打印流
import javax.servlet.ServletException; //异常处理
import javax.servlet.annotation.WebServlet; //网络服务器
//http超文本传输协议
import javax.servlet.http.HttpServlet; // 对象时 Servlet的核心,每当一个客户请求一个 Http Servlet对象时,该对象的 Service()方法就要被调用。
import javax.servlet.http.HttpServletRequest;//请求对象
import javax.servlet.http.HttpServletResponse;//响应对象
import javax.servlet.http.Part;
/**
* 表单数据处理 (表单数据作为请求参数传递到服务端,在服务端通常使用请求对象的成员方法
* String getparameter(name) 获取表单数据
* String[] getParameterValues(name) 获取表单数据(文本域)
* FormServlet 读取 register.html ------页面用户传来的请求参数并显示 用户输入的信息
* */
//网络服务器 servlet运行在web服务器上的java程序
@WebServlet(name = "FormServlet", urlPatterns = { "/register.action" })
public class FormServlet extends HttpServlet {
// 序列化的版本号
private static final long serialVersionUID = -2899814123246634151L;
// 最终的 static 成员常量
private static final String TITLE = "用户信息";
//doPost处理Post请求的的数据并做出响应
@Override //HttpServletRequest 获得请求对象 HttpServletResponse 获得响应对象
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1.处理乱码
request.setCharacterEncoding("utf-8");//请求
response.setCharacterEncoding("utf-8");//响应
response.setContentType("text/html; charset=utf-8");//设置响应内容类型
// 2.获取资源 PrintWriter 字符打印流对象 (字符流)
PrintWriter out = response.getWriter();//响应(流)资源
// 4.响应用户
// println换行打印(Java 语言中的命令)
out.println("<!DOCTYPE html>");
out.println("<html><head>");
out.println("<meta charset=\"UTF-8\">");
out.println("<title>" + TITLE + "</title></head>");
out.println("</head>");
out.println("<body><h4>" + TITLE + "</h4>");
out.println("<table>");
out.println("<tr><td>用户名</td>");
// 3.获取数据
String username = request.getParameter("username");
out.println("<td>" + username + "</td></tr>");
out.println("<tr><td>密码:</td>");
out.println("<td>" + request.getParameter("password") + "</td></tr>");
out.println("<tr><td>性别:</td>");
out.println("<td>" + request.getParameter("sex") + "</td></tr>");
out.println("<tr><td>年龄:</td>");
out.println("<td>" + request.getParameter("age") + "</td></tr>");
out.println("<tr><td>爱好:</td>");
out.println("<td>");
// 3.获取数据
String[] hobbys = request.getParameterValues("hobby"); //多选按钮有多个 参数的值必须为动态的,以使动态web服务将其状态瞬间从外部更改为内部,或反之亦然。
// 视图层 逻辑判断 数组不能为空否则引发空指针
if (hobbys != null) {
for (String hobby : hobbys) {
System.out.println(hobby);
out.println(hobby + "<br/>");
}
}
// 3.获取数据
out.println("</td></tr>");
out.println("<tr><td>学历:</td>");
out.println("<td>" + request.getParameter("education") + "</td></tr>");
out.println("<tr><td>邮件地址:</td>");
out.println("<td>" + request.getParameter("email") + "</td></tr>");
out.println("<tr><td>简历:</td>");
out.println("<td>" + request.getParameter("resume") + "</td></tr>");
out.println("</table>");
out.println("</body>");
out.println("</html>");
// 5.关闭资源
out.close();
}
}
小结
-
首先,DNS域名解析器会解析你输入的域名(mp.weixin.qq.com),将其对应的IP地址确定下来。可以通过在线工具或者使用cmd命令窗口ping域名获取IP。
-
浏览器会使用默认的80端口与服务器建立HTTP连接。同时,浏览器客户端会随机选择一个可用的端口作为客户端端口。在客户端和服务器进程之间,会建立一个套接字用于通信。
-
HTTP客户端通过套接字向服务器发送一个HTTP请求报文。这个请求报文中包含了请求的资源路径(mp/appmsgalbum),而问号后面则是我们需要的参数。关于HTTP请求报文的详细内容,我们稍后会进行详细讨论。
-
HTTP服务器通过套接字接收到这个请求报文后,会对请求进行解析,并从存储器(RAM或磁盘)中检索出请求的对象(mp.weixin.qq.com/mp/appmsgalbum)。然后,服务器会将检索到的对象封装到HTTP响应报文中,并通过套接字发送给客户端。
-
HTTP服务器会通知TCP断开连接。实际上,TCP连接的断开需要等到客户端完全接收完响应报文后才会断开连接。
-
当HTTP客户端接收完响应报文后,TCP连接会关闭。客户端会从响应报文中提取出响应的文件,并对HTML文件进行检查。然后,客户端会循环检查报文中的其他内部对象。
-
在检查完成后,HTTP客户端会将相应的资源通过显示器呈现给用户。