java_web servlet第二课

来源:互联网 发布:sqlserver 删除表约束 编辑:程序博客网 时间:2024/06/04 19:28

在上一节中,我们实现了servlet的helloworld程序,这一节,我们在上一节的基础上进行扩展,

下面还是来看一些基本的概念。


1、常见的错误及处理方式
(1)404
说明: 404是一个状态码,状态码是一个三位数字,
由w3c定义,表示web服务器处理请求的一种状态。
404表示服务器依据请求地址找不到请求资源。
错误原因:
a,没有部署
b,请求地址写错
c,<servlet-name>写错
解决方式:
a,部署应用
b,按照 http://ip:port/appname/servlet-url
检查请求地址。
c,检查<servlet-name>
(2)500
说明:500也是一个状态码,表示系统出错。
错误原因:
a,程序运行出错
比如,对输入的参数没有做相关的检查,
访问数据库时,数据库服务不可用。
b,servlet没有实现Servlet接口或者继承
HttpServlet。
c,<servlet-class>写错。
解决方式:
a,检查程序源代码。
b,必须确保<servlet-class>与实际的类名一致。
(3)405
说明:服务器找不到处理方法。
原因: service方法写错。
解决方式:仔细检查service方法的签名

2、http协议(了解)
(1)http(hypertext transfer protocol)协议是什么?
由w3c制订的一种网络应用层协议,规定了
浏览器与web服务器之间如何通信以及相应的数据
格式。
1)如何通信
step1,浏览器建立与服务器之间的连接。
step2,浏览器将请求数据打包并发送。
step3,服务器将响应数据打包并发送。
step4,服务器立即关闭连接。
如果浏览器要发送新的请求,需要重新建立
新的连接。
“一次请求,一次连接"。
优点:高效(即服务器可以利用有限的连接为
尽可能多的客户端服务)。
缺点:状态管理的问题。


2)数据格式
a,请求数据包
请求行: 
请求方式 请求资源路径 协议类型和版本
消息头: 
是一些键值对,表示特定的含义,浏览器
与服务器之间都可以发送。比如,浏览器
可以发送一个"User-Agent"消息头,告诉
服务器,浏览器的类型和版本。
实体内容:
只有当请求方式为post的时候,实体内容
才有数据(请求参数),如果请求方式是get,
请求参数会添加到请求资源路径的后面。
b,响应数据包
状态行: 协议及版本 状态码 状态描述
消息头:服务器也可以发送一些消息头给
浏览器,比如"content-type",告诉浏览器,
服务器返回的数据类型和字符集。
实体内容:程序处理的结果。
(2)get请求与post请求
1)哪一些情况下,浏览器会发送get请求?
a,直接在浏览器地址栏输入某个地址
b,点击链接
c,表单默认的提交方式
2)get请求的特点
a,会将请求参数添加到请求资源路径的后面,
因为请求行最多只能存放2k左右的数据,所以,
get请求只能发送少量的请求参数。
b,会将请求参数显示在浏览器地址栏,不安全。
比如,路由器会记录访问地址。
3)哪一些情况,浏览器会发送post请求
设置了表单的method="post"。
4)post请求的特点
a,将请求参数放到实体内容里面,所以,可以
提交大量的数据给服务器。
b,不会将请求参数显示在浏览器地址栏,相对 
安全(不会加密,对于敏感数据,需要加密)。


3、servlet如何输出中文?
(1)常识
a,java语言使用unicode字符集来保存字符。
b,编码:将unicode字符集对应的字节数组转换成
某种本地字符集(gbk,utf-8等等)对应的字节数组。
c,解码:某种本地字符集(gbk,utf-8等等)对应的
字节数组转换成unicode字符集对应的字节数组。
(2)乱码问题产生的原因:
out.println输出时,容器默认会使用"iso-8859-1"
去编码。
(3)解决方式:
response.setContentType(
"text/html;charset=字符集");
字符集必须支持中文,比如"gbk","utf-8"

下面我们对上一节的例子进行扩展


需求:设计一个添加员工页面(addEmp.html),该页面包含一个表单,用于提交员工的基本信息(姓名,薪水,年龄),
表单提交给一个Servlet来处理(AddEmpServlet),该Servlet先读取员工基本信息然后输出。
(先不用考虑中文参数值的问题)。


代码如下:

package web;


import java.io.IOException;
import java.io.PrintWriter;


import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class AddEmpServlet extends HttpServlet{
public void service(HttpServletRequest request,
HttpServletResponse response)
throws ServletException,IOException{
//request.setCharacterEncoding("utf-8");
String name = 
request.getParameter("name");
name = new String(
name.getBytes("iso-8859-1"),"utf-8");
System.out.println("name:" + name);
String salary = 
request.getParameter("salary");
String age = 
request.getParameter("age");
/*
* 读取完请求参数之后,一定要做验证,
* 比如,检查salary是不是一个合法的数字。
* 此处略。
*/
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.println(name + " " + salary + " " + age);
out.close();
}


}


html页面代码:

<html>
<head>
<!-- 模拟一个消息头(content-type),
告诉浏览器正在处理的数据的类型和字符集 -->
<meta http-equiv="content-type" 
content="text/html;charset=utf-8">
</head>
<body style="font-size:30px;font-style:italic;">
<form action="add" method="post">
<fieldset>
<legend>添加员工</legend>
姓名:<input name="name"/><br/>
薪水:<input name="salary"/><br/>
年龄:<input name="age"/><br/>
<input type="submit" value="提交"/>
</fieldset>
</form>
</body>
</html>

web.xml如下

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 
xmlns="http://java.sun.com/xml/ns/j2ee" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
 
  <servlet>
  <servlet-name>addEmpServlet</servlet-name>
  <servlet-class>web.AddEmpServlet</servlet-class>
  </servlet>
 
  <servlet-mapping>
  <servlet-name>addEmpServlet</servlet-name>
  <url-pattern>/add</url-pattern>
  </servlet-mapping>
</web-app>



4、表单的处理
(1)如何获得请求参数值。
a,String request.getParamter(StringparamName);
注意:
如果参数名写错(paramName与实际的参数名不一致),返回null。
b,String[] request.getParameterValues(String 
paramName);
注意:
当有多个参数名相同,用此方法。
(2)如何读取中文参数值
1)乱码问题产生的原因
表单提交时,浏览器 会对表单中的中文参数值
进行编码(会使用打开表单所在的页面时的字符集
来编码)。服务器端默认情况下,会使用
"iso-8859-1"去解码。
2)解决方式
step1,保证浏览器按照指定的字符集来编码:
<meta http-equiv="content-type" 
content="text/html;charset=utf-8">
step2,服务器端,按照指定的字符集去解码:
方式一:
request.setCharacterEncoding("utf-8");
注意:该方法只对post请求有效。
方式二:
new String(name.getBytes("iso-8859-1"),
"utf-8");



0 0
原创粉丝点击