第三章Http协议(1)

本章主干知识点:

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>");
	}
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值