本章主干知识点:
1、Content-Type是什么;乱码问题解决;
第 1 节1-关于ContentType不要让浏览器去猜
第 2 节2-解决获取参数乱码和显示乱码问题
第 3 节3-案例:新建一个人
第 4 节4-案例:显示所有的人
第 1 节1-关于ContentType不要让浏览器去猜
第 2 节2-解决获取参数乱码和显示乱码问题
解决乱码
1.ContentType的问题 <strong>aa</a>。不要不指定
2.可能乱码的环节:请求、显示。原则:全部编码一致就不会乱码。
3.请求乱码:尽量避免在URL中使用中文(使用后面的Post)。因为Tomcat默认使用ISO-8859-1编码解析,因此需要先使用ISO-8859-1转换为byte[]二进制,然后再重新用UTF-8编码创建为String。封装为一个通用方法。备注。注意:IE6等低版本仍然可能有问题,不管他。
4.输出乱码(三个设置上万无一失):
1)resp.setContentType("text/html;charset=UTF-8");
2)resp.setCharacterEncoding("UTF-8");
3)html中<metacharset='utf-8' />
5.数据库全程用一个编码:连接字符串;数据库;表;字段。
【Encode1.html】
<!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 action="encode1" method="get">
<input type="text" name="txt1"/>
<input type="submit" value="click"/>
</form>
<a href="" id="a1">click</a>
<input type="button" id="btn1" value="test"/>
<script type="text/javascript">
var btn1 = document.getElementById("btn1");
btn1.οnclick=function(){
/*
var a1 = document.getElementById("a1");
var txt1 = "a&b=3";
//alert(txt1);
alert(encodeURIComponent(txt1));
alert(encodeURI(txt1))
a1.href="encode1?txt1="+encodeURIComponent(txt1);*/
/*
var s = "http://www.rupeng.com/login?username=如鹏&password=a b";
alert(encodeURI(s));
alert(encodeURIComponent(s));*/
/*
var s = "http://www.rupeng.com/login?username=如鹏&password=a b";
var a1 = document.getElementById("a1");
a1.href=encodeURI(s);*/
var txt1 = "http://www.rupeng.com";
var a1 = document.getElementById("a1");
//a1.href="encode1?txt1="+encodeURIComponent(txt1);
a1.href="encode1?txt1="+encodeURI(txt1);
var s1 = encodeURIComponent(txt1);
alert(s1);
var s2 = decodeURIComponent(s1);
alert(s2);
};
</script>
</body>
</html>
【Encode1Servlet.java】
package com.rupeng.test1;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Encode1Servlet extends HttpServlet
{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
String txt1 = req.getParameter("txt1");//对于浏览器提交的编码后的value,服务器会解码
resp.setContentType("text/html;charset=UTF-8");//不要让浏览器去猜“服务器返回给我的是什么格式”
//resp.setContentType("text/plain");//返回给你的就是普通文本,不要当成html去解析
resp.setCharacterEncoding("UTF-8");
byte[] bytes = txt1.getBytes("ISO-8859-1");
String utf8Txt1 = new String(bytes,"UTF-8");//就不乱吗了:先用ISO-8859-1得到bytes
//然后再用UTF-8解析得到新字符串
//resp.getWriter().println("<html><head><meta charset='utf-8'/></head><body>");
resp.getWriter().println("<html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8'></head><body>");
resp.getWriter().print("<strong>"+utf8Txt1+"</strong>");
resp.getWriter().print("</body></html>");
//String h = "a&b=3";
/*
String h = URLEncoder.encode("a&b=3", "UTF-8");
String html = "<a href='http://www.rupeng.com/a?un="+h+"'>aaa</a>";
resp.getWriter().print(html);
String h1 = URLDecoder.decode(h, "UTF-8");
resp.getWriter().print(h1);*/
}
}
第 3 节3-案例:新建一个人
第 4 节4-案例:显示所有的人
写表单保存到数据库,避免乱码问题。
再写一个页面把这个表中所有数据都显示出来。
创建数据库webstudy1
新建表T_Persons
设置字段 Id name nickname age major xqx
【AddPerson.html】
<!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 action="addPerson" method="get">
姓名:<input type="text" name="name"/><br/>
昵称:<input type="text" name="nickName"/><br/>
年龄:<input type="text" name="age"/><br/>
<input type="checkbox" name="isTuHao" id="isTuHao"/><label for="isTuHao">是否富二代</label><br/>
专业:<select name="major">
<option value="jsj">计算机</option>
<option value="xxgl">信息管理</option>
<option value="jixie">机械</option>
</select>
<br/>
性取向:<input type="radio" name="xqx" value="male" id="male"/><label for="male">喜欢男的</label>
<input type="radio" name="xqx" value="female" id="female"/><label for="female">喜欢女的</label>
<input type="radio" name="xqx" value="both" id="both"/><label for="both">通吃</label><br/>
<input type="submit" value="保存"/>
</form>
</body>
</html>
写一个通用方法类
【RuPengUtils.java】
package com.rupeng.test1;
import java.io.UnsupportedEncodingException;
import javax.servlet.http.HttpServletRequest;
public class RuPengUtils
{
/**
* 从req中取出名字为paramName的值,自动处理参数乱吗的问题
* @param req
* @param paramName
* @return 不乱码的参数值
*/
public static String getParameter(HttpServletRequest req, String paramName)
{
try
{
String value = req.getParameter(paramName);// 先得到乱码的字符串
byte[] bytes = value.getBytes("ISO-8859-1");
return new String(bytes, "UTF-8");
} catch (UnsupportedEncodingException ex)
{
throw new RuntimeException(ex);
}
}
}
【addPersonServlet步骤:】
目的:接受浏览器提交的信息 并把信息写入数据库表里
写页面addPerson.html
form action=addPerson method=get
三个text name
一个checkbox
一个select 三个option value
一个radio name value 一个label for
一个submit
1.继承类HttpServlet
2.重写方法doGet
3.写一个RuPengUtils的类getParameter方法来解决接受数据乱码问题
用到getBytes 和 new String
4.req.getParameter来接收浏览器提交信息
5.用jdbcUtils.executeUpdate来把数据更新到数据库
6.页面打印显示检测是否插入成功
7.填写resp.set……解决数据乱码问题
注意问题:
如果数据库中打开是乱码,步骤
1:获取的请求参数是不是乱码。
2:数据库连接字符串、数据库编码等是否乱码。
【AddPersonServlet.java】
package com.rupeng.test1;
import java.io.IOException;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class AddPersonServlet extends HttpServlet
{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
//如果数据库中打开是乱码,步骤
//1:获取的请求参数是不是乱码。
//2:数据库连接字符串、数据库编码等是否乱码。
String name = RuPengUtils.getParameter(req, "name");
String nickName = RuPengUtils.getParameter(req, "nickName");
int age = Integer.parseInt(req.getParameter("age"));
//boolean isTuHao = req.getParameter("isTuHao").equals("on");
boolean isTuHao = "on".equals(req.getParameter("isTuHao"));
String major = req.getParameter("major");
String xqx = req.getParameter("xqx");
resp.setContentType("text/html;charset=UTF-8");
resp.setCharacterEncoding("UTF-8");
try
{
JdbcUtils.executeUpdate("Insert into T_Persons(Name,NickName,Age,IsTuHao,Major,XQX) values(?,?,?,?,?,?)",
name,nickName,age,isTuHao,major,xqx);
resp.getWriter().print("插入成功");
} catch (SQLException e)
{
resp.getWriter().print("数据库执行失败");
}
}
}
配置web.xml
【ShowPersonServet步骤】
文件名称:ShowPersonServlet
目的:把数据库表格T_Persons的数据在页面上显示出来
修改 web.xml
继承类HttpServlet
重写方法doGet
1.先解决乱码 两个 resp.set……UTF-8
setcontenttypesetcharacterEncoding
2.printwriter获取getwriter
3.writer.println……html页面框架
4.制作表格
5.jdbcutils executequery 查询数据库
6.遍历 rs.next
7.获取rs.getString元素
8.格式化下 土豪
9.if判断下major的内容 equals转换为中文信息
10.知道数据库存储数据用字母的方便性
【ShowPersonsServlet.java】
package com.rupeng.test1;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ShowPersonsServlet extends HttpServlet
{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
resp.setContentType("text/html;charset=UTF-8");
resp.setCharacterEncoding("UTF-8");
PrintWriter writer = resp.getWriter();
writer.println("<html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>");
writer.println("</head><body>");
writer.println("<table><thead><tr><td>姓名</td><td>昵称</td><td>年龄</td><td>是否土豪</td><td>专业</td><td>性取向</td></tr></thead>");
writer.println("<tbody>");
try
{
ResultSet rs = JdbcUtils.executeQuery("select * from T_Persons");
try
{
while(rs.next())
{
String name = rs.getString("Name");
String nickName = rs.getString("NickName");
int age = rs.getInt("Age");
boolean isTuHao = rs.getBoolean("IsTuHao");
String major = rs.getString("Major");
String majorName;//="未知";
if(major.equals("jsj"))
{
majorName="计算机";
}
else if(major.equals("xxgl"))
{
majorName="信息管理";
}
else if(major.equals("jixie"))
{
majorName="机械";
}
else
{
majorName="未知";
}
String xqx = rs.getString("XQX");
String xqxName;
if(xqx.equals("male"))
{
xqxName="喜欢男的";
}
else if(xqx.equals("female"))
{
xqxName = "喜欢女的";
}
else if(xqx.equals("both"))
{
xqxName = "通吃";
}
else
{
xqxName = "未知";
}
writer.println("<tr><td>"+name+"</td><td>"+nickName+"</td><td>"+age
+"</td><td>"+(isTuHao?"土豪":"非土豪")+"</td><td>"+majorName+"</td><td>"+xqxName+"</td></tr>");
}
}
finally
{
JdbcUtils.closeAll(rs);
}
} catch (SQLException e)
{
writer.println("查询出错");
}
writer.println("</tbody>");
writer.println("</table>");
writer.println("</body></html>");
}
}