在了解了servlet的生命周期以及运行过程后,再来动手写一个小例子,加深对servlet的理解。

一、需求说明

在用户注册信息页面,输入用户名、密码、性别、邮箱等一些信息后,页面返回刚刚填写的信息。

二、准备工作

开发环境:win7系统64位,jdk1.8

开发工具:eclipse、Tomcat、Maven

三、开发步骤

1、新建一个Maven项目

步骤在前两次的文章中都有,如果还不熟练可以看前面的文章,按照步骤来新建一个Maven项目。

2、新建一个实体类

新建一个User.java实体类,包含姓名、密码、性别、邮箱、自我介绍、出生日期、爱好、是否接受用户协议字段。然后快速生成get、set方法。

package entity;

import java.util.Date;

/**
* 用户信息实体类
* @author 小川94
* @date 2018年6月6日
*/
public class User { private String userName; // 姓名
private String password; // 密码
private String gender; // 性别
private String email; // 邮箱
private String introduce; // 自我介绍
private Date birthday; // 出生日期
private String[] favorites; // 爱好
private boolean flag; // 是否接受用户协议 public User(){ } public String getUserName() {
return userName;
} public void setUserName(String userName) {
this.userName = userName;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} public String getGender() {
return gender;
} public void setGender(String gender) {
this.gender = gender;
} public String getEmail() {
return email;
} public void setEmail(String email) {
this.email = email;
} public String getIntroduce() {
return introduce;
} public void setIntroduce(String introduce) {
this.introduce = introduce;
} public Date getBirthday() {
return birthday;
} public void setBirthday(Date birthday) {
this.birthday = birthday;
} public String[] getFavorites() {
return favorites;
} public void setFavorites(String[] favorites) {
this.favorites = favorites;
} public boolean isFlag() {
return flag;
} public void setFlag(boolean flag) {
this.flag = flag;
}
}

3、新建一个servlet,包含下列五个步骤

A.设置页面请求参数的编码格式

B.获取从页面录入的数据信息,获取单个数据使用request.getParameter(String str)方法,如姓名、性别等;获取多个数据使用request.getParameterValues(String str)方法,如兴趣爱好等。

C.将获取的数据信息传入新建的user对象

D.将user对象放入session,方便跳转的页面获取

E.转发到user的详细信息页面

/**
* 用户注册servlet
* @author 小川94
* @date 2018年6月6日
*/
public class RegisterServlet extends HttpServlet { private static final long serialVersionUID = 1L; @Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
} @Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置从页面获取数据的编码格式
request.setCharacterEncoding("utf-8");
String userName, password, gender, email, introduce;
Date birthday;
String[] favorites;
boolean flag;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
User u = new User();
// 获取页面录入的信息
try{
userName = request.getParameter("userName");
password = request.getParameter("password");
gender = request.getParameter("gender");
email = request.getParameter("email");
introduce = request.getParameter("introduce");
birthday = sdf.parse(request.getParameter("birthday"));
if(request.getParameter("flag") != null){
flag = true;
}else{
flag = false;
}
favorites = request.getParameterValues("favorites");
// 为user设值
u.setBirthday(birthday);
u.setEmail(email);
u.setFavorites(favorites);
u.setFlag(flag);
u.setGender(gender);
u.setIntroduce(introduce);
u.setPassword(password);
u.setUserName(userName);
// 将user信息存入session中,方便调转的页面获取
request.getSession().setAttribute("RegUser", u);
// 转发到user的信息页面
request.getRequestDispatcher("userinfo.jsp").forward(request, response);
}catch(Exception e){
e.printStackTrace();
}
}
}

4、新建两个jsp页面

新建一个register.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>用户注册</title>
</head>
<body>
<div style="padding-top: 60px;" align="center">
<form action="registerServlet" method="post" >
<table>
<tr>
<td style="font-size:18px;text-align: right;">用户名</td>
<td>
<input style="width:200px; height:20px;" type="text" name="userName"/>
</td>
</tr>
<tr>
<td style="font-size:18px;text-align: right;">密码</td>
<td>
<input style="width:200px; height:20px;" type="password" name="password"/>
</td>
</tr>
<tr>
<td style="font-size:18px;text-align: right;">确认密码</td>
<td>
<input style="width:200px; height:20px;" type="password" name="confirmPassword"/>
</td>
</tr>
<tr>
<td style="font-size:18px;text-align: right;">出生日期</td>
<td>
<input style="width:200px;height:20px;" type="date" name="birthday"/>
</td>
</tr> <tr>
<td style="font-size:18px;text-align: right;">性&nbsp;&nbsp;别</td>
<td>
<input style="width:65px;height:18px;" type="radio" value="男" name="gender"/>男
<input style="width:65px;height:18px;" type="radio" value="女" name="gender"/>女
</td>
</tr> <tr>
<td style="font-size:18px;text-align: right;">邮&nbsp;&nbsp;箱</td>
<td>
<input style="width:200px; height:20px;" type="text" name="email"/>
</td>
</tr>
<tr>
<td style="font-size:18px;text-align: right;">爱好</td>
<td>
<input type="checkbox" name="favorites" value="电影"/>电影
<input type="checkbox" name="favorites" value="阅读"/>阅读
<input type="checkbox" name="favorites" value="跑步"/>跑步
<input type="checkbox" name="favorites" value="旅行"/>旅行
</td>
</tr>
<tr>
<td style="font-size:18px;text-align: right;">自我介绍</td>
<td>
<textarea rows="6" cols="26" name="introduce"></textarea>
</td>
</tr>
<tr>
<td style="font-size:18px;text-align: right;">是否接受用户协议</td>
<td>
<input type="radio" value="true" name="flag"/>xxxx用户协议
</td>
</tr>
</table>
<div style="height:40px;">
<input type="submit" value="提交"/>
<input type="reset" value="重置"/>
</div>
</form>
</div>
</body>
</html>

新建一个userinfo.jsp页面,回显注册信息。

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
import="java.text.*,java.util.*"
%>
<!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>用户信息</title>
</head>
<body style="margin:50px;"> <jsp:useBean id="RegUser" class="entity.User" scope="session"></jsp:useBean>
<table width="600px;" cellspacing="0" cellpadding="0" border="1px;">
<tr>
<td style="width:150px;">用户名</td>
<td>&nbsp;<jsp:getProperty property="userName" name="RegUser"/></td>
</tr>
<tr>
<td style="width:150px;">密码</td>
<td>&nbsp;<jsp:getProperty property="password" name="RegUser"/></td>
</tr>
<tr>
<td style="width:150px;">出生日期</td>
<td>&nbsp;
<%
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
String date = sdf.format(RegUser.getBirthday());
%>
<%=date %>
</td>
</tr>
<tr>
<td style="width:150px;">性别</td>
<td>&nbsp;<jsp:getProperty property="gender" name="RegUser"/></td>
</tr>
<tr>
<td style="width:150px;">邮箱</td>
<td>&nbsp;<jsp:getProperty property="email" name="RegUser"/></td>
</tr>
<tr>
<td>爱好</td>
<td>&nbsp;
<%
String[] favorites = RegUser.getFavorites();
for(String f : favorites){
%>
<%=f %>
<%
}
%>
</td>
</tr>
<tr>
<td>自我介绍</td>
<td>&nbsp;<jsp:getProperty property="introduce" name="RegUser"/></td>
</tr>
<tr>
<td>是否接受用户协议</td>
<td>&nbsp;<jsp:getProperty property="flag" name="RegUser"/></td>
</tr>
</table> </body>
</html>

5、配置web.xml文件

  <servlet>
<servlet-name>register</servlet-name>
<servlet-class>servlet.RegisterServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>register</servlet-name>
<url-pattern>/registerServlet</url-pattern>
</servlet-mapping>

6、部署测试

整个项目的目录结构如下图所示

页面测试结果如下图

四、常见错误问题和解决办法

1、乱码问题

乱码原因是浏览器和服务器之间的数据传输编码格式是ISO-8859-1,不是常见的utf-8格式,如果只是在eclipse和jsp页面设置编码格式为utf-8,是没效果的,需要在处理具体的业务之前定义好请求的编码格式,如果响应的数据里面也包含中文,在返回具体的数据前也需要定义好响应的数据编码格式。

request.setCharacterEncoding("utf-8");

response.setContentType("text/html;charset=UTF-8");

request.setCharacterEncoding("utf-8")只适用于POST请求。

也可以在server.xml文件增加URIEncoding属性,此方法只适用GET请求。

<Connector URIEncoding="utf-8" connectionTimeout="20000" port="8088" protocol="HTTP/1.1" redirectPort="8443"/>

2、404、500错误

404是最常见的错误之一,原因是请求路径找不到对应的资源,以http://ip:port/appname/url-pattern为模板来检查路径是否错误。

500也是常见的错误,原因是程序运行出错,或者没有继承HttpServlet,也有可能是web.xml里面配置类信息<servlet-class>标签时,写错了类的路径或名字。

3、后台报ClassNotFoundException错误

每次更新servlet的代码,都需要重新部署到Tomcat上去,有时可能会有缓存,也有可能是代码未编译,也有可能是web.xml里面配置类信息<servlet-class>标签时,写错了类的路径或名字,需要清理一下,然后再重新发布部署。

文章首发于我的个人公众号:悦乐书。喜欢分享一路上听过的歌,看过的电影,读过的书,敲过的代码,深夜的沉思。期待你的关注!

公众号后台输入关键字“Java学习电子书”,即可获得12本Java学习相关的电子书资源,如果经济能力允许,还请支持图书作者的纸质正版书籍,创作不易。

Servlet(三):获取表单数据、解决乱码和报错问题的更多相关文章

  1. Servlet的5种方式实现表单提交(注册小功能),后台获取表单数据

    用servlet实现一个注册的小功能 ,后台获取数据. 注册页面: 注册页面代码 : <!DOCTYPE html> <html> <head> <meta ...

  2. ASP.NET MVC 获取表单数据

    public class Person { public string Name{get;set;} public string Phone{get;set;} } view层 @model Mode ...

  3. asp.net使用post方式action到另一个页面,在另一个页面接受form表单的值!(报错,已解决!)

    原文:asp.net使用post方式action到另一个页面,在另一个页面接受form表单的值!(报错,已解决!) 我想用post的方式把一个页面表单的值,传到另一个页面.当我点击Default.as ...

  4. laravel 项目表单中有csrf_token,但一直报错419错误 解决redis连接错误:MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persi

    laravel 项目表单中有csrf_token,但一直报错419错误,因为项目中使用到Redis缓存,在强制关闭Redis后出现的问题,查询laravel.log文件查找相关问题 安装redis后在 ...

  5. 1.3(学习笔记)Servlet获取表单数据

    一.Servlet获取表单数据 表单提交数据经由Servlet处理,返回一个处理结果显示在页面上, 那么如何获取表单提交的参数进出相应的处理呢? 主要用到以下方法: String  getParame ...

  6. Servlet 笔记-读取表单数据

    Servlet 处理表单数据,这些数据会根据不同的情况使用不同的方法自动解析: getParameter():您可以调用 request.getParameter() 方法来获取表单参数的值. get ...

  7. JSP简单练习-获取表单数据

    在JSP中,server端程序与client交互最经常使用的方法就是採用表单提交数据.表单提交的方法主要有两种,一种是get方法.还有一种是post方法.两者最大的差别:使用get方法提交的数据会显示 ...

  8. Servlet 响应 响应相关与重定向 请求 获取表单数据2种方法

    一.HttpServletResponse  (响应) 包括下面三个: 1.响应消息行  HTTP/1.1  200 OK 200是HTTP状态码, 代表请求已成功. (查httpservletres ...

  9. 用Servlet获取表单数据

    用Servlet获取表单数据 在webroot下新建userRegist2.jsp 代码如下: <%@ page contentType="text/html;charset=gb23 ...

随机推荐

  1. cobbler单台服务器实现批量自动化安装不同版本系统-技术流ken

    前言 在上一篇博文<cobbler批量安装系统使用详解-技术流ken>中已经详细讲解了cobbler的使用以及安装,本篇博文将会使用单台cobbler实现自动化批量安装不同版本的操作系统. ...

  2. JavaScript 系列博客(一)

    JavaScript 系列博客(一) 前言 本系列博客为记录学习 JavaScript 的学习笔记,会从基础开始慢慢探索 js.今天的学习笔记主要为 js 引入.定义变量以及 JavaScript 中 ...

  3. 本人开源项目 Lu-Rpc

    Lu-Rpc 是个专为学习者准备的 RPC 框架, 初始架构非常简单, 可供初学者扩展和学习. Lu 可以认为是中文世界的撸, 即撸 Rpc--- 造个 Rpc 轮子. Lu-Rpc 架构图如下: L ...

  4. IntelliJ IDEA快捷键与使用小技巧

    IntelliJ Idea 常用快捷键列表 修改方法如下: 点击 文件菜单(File) –> 点击 设置(Settings… Ctrl+Alt+S), –> 打开设置对话框. 在左侧的导航 ...

  5. 跨域 webpack + vue-cil 中 proxyTable 处理跨域

    博客地址:https://ainyi.com/27 跨域 了解同源政策:所谓"同源"指的是"三个相同". 协议相同 域名相同 端口相同 解决跨域 jsonp 缺 ...

  6. 怎么将XML字符串转换为XmlDocument,并获取部分节点值

    我们的目标:解析XML字符串,并获取节点:z:row下的属性:ows_LinkFilename的值集合??? XML字符串数据结构如下: <listitems xmlns:s='uuid:BDC ...

  7. 【转载】 Sqlserver查看数据库死锁的SQL语句

    在Sqlsever数据库中,有时候操作数据库过程中会进行锁表操作,在锁表操作的过程中,有时候会出现死锁的情况出现,这时候可以使用SQL语句来查询数据库死锁情况,主要通过系统数据库Master数据库来查 ...

  8. cf1136E. Nastya Hasn't Written a Legend(二分 线段树)

    题意 题目链接 Sol yy出了一个暴躁线段树的做法. 因为题目保证了 \(a_i + k_i <= a_{i+1}\) 那么我们每次修改时只需要考虑取max就行了. 显然从一个位置开始能影响到 ...

  9. 洛谷P4103 [HEOI2014]大工程(虚树 树形dp)

    题意 链接 Sol 虚树. 首先建出虚树,然后直接树形dp就行了. 最大最小值直接维护子树内到该节点的最大值,然后合并两棵子树的时候更新一下答案. 任意两点的路径和可以考虑每条边两边的贡献,\(d[x ...

  10. CentOS7系统搭建外网环境

    理一下思路第一步 Vultr 注册 充值10刀了: 可以支付宝支付.不再需要绑定银行卡 第二步 选择 一个自己中意的款 系统啊流量之类的购买     Deploy New Instance 第三步  ...