1 简述GET和POST的区别。

参考答案

GET和POST的区别如下:

1. 从提交的数据量上来说,get方式会将请求参数及参数值放在请求资源路径里面,携带的数据大小有限制,不适合提交大量的数据;post方式会将请求参数及参数值放在实体内容里面,理论上没有限制,适合大量数据的提交。

2.从安全上来讲,post方式相对安全(因为请求参数及值存放在实体内容里面,而get方式会将请求参数及值显示在浏览器地址栏)。但是要注意,post方式并没有将数据加密。

2 简述如何处理表单提交的中文。

参考答案

处理表单提交的中文,分为两种情况,一是post方式提交表单、一是get方式提交表单。

1. 处理post方式提交表单时的中文,步骤如下:

<meta http-equiv =“content-type”content =“text/html;charset=utf-8”>

另外,在HTML中,将表单form的提交方式设置为post。

request.setCharacterEncoding(“utf-8”);

该行代码要在第一次使用request的时候进行设置。

2. 处理get方式提交表单时的中文,步骤如下:

<meta http-equiv =“content-type”content =“text/html;charset=utf-8”>

另外,在HTML中,将表单form的提交方式设置为get。

String username = request.getParameter(“username”);
username = new String(username.getBytes(“iso-8859-1”),“utf-8”);

3 阅读下面的代码,说明序号处代码的含义。

public class AddEmpServlet extends HttpServlet{
	public void service(HttpServletRequest request,
			HttpServletResponse response)
	throws ServletException,IOException{
		
		request.setCharacterEncoding("utf-8");		
		String name = request.getParameter("name");//-----------------------1
		double salary = Double.parseDouble(
				request.getParameter("salary"));
		int age = Integer.parseInt(
				request.getParameter("age"));
		System.out.println("name:" + name);
		System.out.println("salary:" + salary);
		System.out.println("age:" + age);
		response.setContentType("text/html;charset=utf-8");//---------------2
		PrintWriter out = response.getWriter();
		out.println("<h1>"+name+"</h1>");
		
	}
}

参考答案

本题中两个序号处代码的含义如下:

1、获取请求参数name的值。

2、保证servlet输出中文无乱码。

4 编写一个Servlet,用户通过表单提交,新建一个帐务帐号信息。

将客户端提交的帐务帐号信息,使用JDBC的技术插入到account表中。帐务帐号信息表的结构如表-1所示:

表-1 帐务帐号信息表(ACCOUNT)

添加界面如图-1所示。

图– 1

在文本框中填入信息,点击“添加”按钮将数据添加到数据的account表中。

参考答案

首先,在Oracle中建立一个名为account的表,其字段内容如表-1所示,并创建序列account_id_seq,用于主键列的自动生成。然后,在处理表单信息的Servlet中,使用JDBC技术完成连接数据库,并使用获取的请求参数值构建insert语句,执行后完成帐务帐号信息的增加操作。操作成功或失败均返回给用户响应的提示信息。

实现此案例需要按照如下步骤进行。

步骤一:执行SQL语句创建account表

在当前工程目录下,右键新建一个名为day02_exec.sql的文件,在该文件中编写建表语句、插入语句以及创建序列的语句,如图-2,图-3所示。

图– 2

图–3

在sql文件中,编写完SQL语句后,为了执行,可以选中要执行的SQL语句,然后点击左边的绿色按钮,即代表执行。为了查看表是否创建,可以在执行完以后到DB Browser视图中,打开对应的连接,查看下面的table节点下是否有更新。

表创建成功之后,继续在sql文件中编写insert语句及序列,选中后执行。为了查看表内的数据,可以通过如下SQL语句进行查询,SQL语句如下:

select * from account;

查询结果如图-4所示。

图–4

步骤二:新建addAccount.html页面

新建addAccount.html页面,该页面的代码如下所示:

<html>
	<head>
		<meta http-equiv="content-type" content="text/html;charset=utf-8">
	</head>
	<body style="font-size:24px">
		<form action="addAccount" method="post">
			<fieldset>
				<legend>添加帐务帐号</legend>
				姓名:<input name="realName"/><br>
				身份证:<input name="idcardNo"/><br>
				登录名:<input name="loginName"/><br>
				手机号:<input name="telephone"/><br>
				<input type="submit" value="添加"/>
			</fieldset>
		</form>
	</body>
</html>

步骤三:新建AddAccountServlet.java类

编写有关数据库操作的代码,代码如下所示:

package web;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
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 AddAccountServlet extends HttpServlet {

	public void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 设置中文的输入和输出
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=UTF-8");
		// 获取输出流对象
		PrintWriter out = response.getWriter();
		// 获取表单提交的数据
		String realName = request.getParameter("realName");
		String idcardNo = request.getParameter("idcardNo");
		String loginName=request.getParameter("loginName");
		String telephone=request.getParameter("telephone");
		//将数据插入到数据库t_emp表中
		Connection conn = null;
		PreparedStatement stat = null;
		try {
			Class.forName("oracle.jdbc.OracleDriver");
			conn = DriverManager.getConnection(
					"jdbc:oracle:thin:@localhost:1521:orcl", "scott", "tiger");
			stat = conn.prepareStatement("insert into account" +
					"(account_id,login_name,status,real_name,idcard_no,telephone) " +
					"values(account_id_seq.nextval,?,?,?,?,?)");
			stat.setString(1, loginName);
			stat.setString(2, "0");//添加创建即为开通状态
			stat.setString(3, realName);
			stat.setString(4, idcardNo);
			stat.setString(5, telephone);
			stat.executeUpdate();
			out.println("添加成功");
			out.print("<a href='listAccount'>查看帐务帐号信息列表</a>");
		} catch (Exception e) {
			e.printStackTrace();
			out.print("系统繁忙,稍后重试");
		} finally{
			if(stat!=null){
				try {
					stat.close();
				} catch (SQLException e) {					
					e.printStackTrace();
				}
			}
			if(conn!=null){
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

Web程序中,使用JDBC连接数据库,需要将连接Oracle数据库的jar包添加到工程环境中。对于web工程,只需要将jar包复制后,粘帖到当前工程的WEB-INF目录下的lib目录中,Eclipse会自动将jar包加入到web工程环境中。

步骤四:添加AddAccountServlet的映射

在web.xml文件中配置AddAccountServlet的映射信息,如图-5所示。

图– 5

步骤五:部署应用,访问addAccount.html页面,查看结果

部署应用,访问addAccount.html页面填写数据后点击提交。可以到SQL Result界面中,通过执行查询语句确认增加操作是否执行成功。结果请参考图-6,图-7。

图– 6

图– 7

通过图- 6,图- 7可以看出,已经将页面输入的数据插入到数据库的account表中。

本案例的完整代码如下所示。

addAccount.html文件完整代码如下所示:

	<html>
	<head>
		<meta http-equiv="content-type" content="text/html;charset=utf-8">
	</head>
	<body style="font-size:24px">
		<form action="addAccount" method="post">
			<fieldset>
				<legend>添加帐务帐号</legend>
				姓   名:<input name="realName"/><br>
				身份证:<input name="idcardNo"/><br>
				登录名:<input name="loginName"/><br>
				手机号:<input name="telephone"/><br>
				<input type="submit" value="添加"/>
			</fieldset>
		</form>
	</body>
</html>

AddAccountServlet.java文件完整代码如下所示:

package web;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
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 AddAccountServlet extends HttpServlet {

	public void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 设置中文的输入和输出
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=UTF-8");
		// 获取输出流对象
		PrintWriter out = response.getWriter();
		// 获取表单提交的数据
		String realName = request.getParameter("realName");
		String idcardNo = request.getParameter("idcardNo");
		String loginName=request.getParameter("loginName");
		String telephone=request.getParameter("telephone");
		//将数据插入到数据库t_emp表中
		Connection conn = null;
		PreparedStatement stat = null;
		try {
			Class.forName("oracle.jdbc.OracleDriver");
			conn = DriverManager.getConnection(
					"jdbc:oracle:thin:@localhost:1521:orcl", "scott", "tiger");
			stat = conn.prepareStatement("insert into account" +
					"(account_id,login_name,status,real_name,idcard_no,telephone) " +
					"values(account_id_seq.nextval,?,?,?,?,?)");
			stat.setString(1, loginName);
			stat.setString(2, "0");//添加创建即为开通状态
			stat.setString(3, realName);
			stat.setString(4, idcardNo);
			stat.setString(5, telephone);
			stat.executeUpdate();
			out.println("添加成功");
			out.print("<a href='listAccount'>查看帐务帐号信息列表</a>");
		} catch (Exception e) {
			e.printStackTrace();
			out.print("系统繁忙,稍后重试");
		} finally{
			if(stat!=null){
				try {
					stat.close();
				} catch (SQLException e) {					
					e.printStackTrace();
				}
			}
			if(conn!=null){
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

web.xml文件完整代码如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!-- 课后练习 -->	
	<servlet>
		<servlet-name>addAccountServlet</servlet-name>
		<servlet-class>web.AddAccountServlet</servlet-class>
	</servlet>
		<servlet-mapping>
		<servlet-name>addAccountServlet</servlet-name>
		<url-pattern>/addAccount</url-pattern>
	</servlet-mapping>
</web-app>

day02_exec.sql文件完整代码如下所示:

create table account(
	account_id		number(9) constraint account_id_pk primary key,
	login_name		varchar2(30)  not null
							constraint account_login_name_uk unique,
	status			char(1)	constraint account_status_ck
						check (status in (0,1,2)) not null,
	real_name		varchar2(20)	not null,
	idcard_no		char(18)		not null
							constraint account_incard_no unique,
	telephone		varchar2(15) not null
);

insert into account
(account_id,login_name,status,real_name,idcard_no,telephone)
values(1001,'taiji001',1,'zhangsanfeng','410381194302256528',13669351234)
;

insert into account
(account_id,login_name,status,real_name,idcard_no,telephone)
values(1002,'mixue001',1,'mixue','410381194302256525',13669351233);

insert into account
(account_id,login_name,status,real_name,idcard_no,telephone)
values(1003,'syl001',1,'stone','410381194302256524',13669351235);
commit;

create sequence account_id_seq increment by 1 start with 1;

select * from account;

5 编写一个Servlet查询数据库,显示所有账务账号信息。

客户端访问服务器后可以返回Account表中所有数据的表格展示,效果如图-8所示:

图- 8

参考答案

在处理请求的Servlet中,使用JDBC技术实现数据库的访问,并且在遍历结果集时,将结果与HTML表格的行、列标签进行结合,生成符合图-8所示的表格样式的标记后,再输出到浏览器显示。

实现此案例需要按照如下步骤进行。

步骤一:新建ListAccountServlet.java文件

新建ListAccountServlet类,在该类中,使用JDBC技术连接数据库,并执行查询语句,对查询结果集遍历后,以表格形式输出,代码如下所示:

package web;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
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 ListAccountServlet extends HttpServlet {

	public void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter out = response.getWriter();		
		//1.连接数据库获取数据
		Connection conn = null;
		PreparedStatement stat = null;
		ResultSet rs = null;
		try{
			Class.forName("oracle.jdbc.OracleDriver");
			conn = DriverManager.getConnection(
					"jdbc:oracle:thin:@localhost:1521:orcl",
					"scott",
					"tiger");
			stat = conn.prepareStatement("select * from account");
			rs = stat.executeQuery();
			//2.输出表格之前的页面标记
			out.println("<HTML>");
			out.println("<HEAD></HEAD>");
			out.println("<BODY>");
			out.println("<table border='1' cellpadding='0' cellspacing='0' width='60%'>");
			out.println("<caption>员工信息列表</caption>");
			out.println("<tr><td>ID</td><td>姓名</td><td>身份证号</td><td>登录名</td>" +
					"<td>状态</td><td>手机号</td></tr>");
			//3.遍历结果集,以表格形式输出数据
			while(rs.next()){
				int id = rs.getInt("account_id");
				String realName = rs.getString("real_name");
				String idcardNo = rs.getString("idcard_no");
				String loginName = rs.getString("login_name");
				String status=rs.getString("status");
				String strStatus="";
				if("1".equals(status)){
					strStatus="暂停";
				}else if("2".equals(status)){
					strStatus="删除";
				}else{
					strStatus="开通";
				}
				String telephone = rs.getString("telephone");
				out.println("<tr><td>"+
						id+"</td><td>"+
						realName+"</td><td>"+
						idcardNo+"</td><td>"+
						loginName+"</td><td>"+
						strStatus+"</td><td>"+
						telephone+"</td></tr>");
			}
			out.print("</table>");
			out.print("<a href='addAccount.html'>添加员工信息</a>");
			out.println("</BODY>");
			out.println("</HTML>");
			out.flush();
			out.close();
		}catch(Exception e){
			e.printStackTrace();
			out.println("系统繁忙,请稍后重试");
		}finally{
			if(conn!=null){
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
		
	}
}

步骤二:添加ListAccountServlet的映射

修改web.xml文件,添加映射信息,如图-9所示。

图–9

步骤三:部署及访问应用

部署后,在浏览器地址栏输入地址http://localhost:8080/应用名/listAccount,查看结果是否与图-8一致。

本案例的完整代码如下所示。

ListAccountServlet.java文件完整代码如下所示:

package web;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
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 ListAccountServlet extends HttpServlet {

	public void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter out = response.getWriter();		
		//1.连接数据库获取数据
		Connection conn = null;
		PreparedStatement stat = null;
		ResultSet rs = null;
		try{
			Class.forName("oracle.jdbc.OracleDriver");
			conn = DriverManager.getConnection(
					"jdbc:oracle:thin:@localhost:1521:orcl",
					"scott",
					"tiger");
			stat = conn.prepareStatement("select * from account");
			rs = stat.executeQuery();
			//2.输出表格之前的页面标记
			out.println("<HTML>");
			out.println("<HEAD></HEAD>");
			out.println("<BODY>");
			out.println("<table border='1' cellpadding='0' cellspacing='0' width='60%'>");
			out.println("<caption>员工信息列表</caption>");
			out.println("<tr><td>ID</td><td>姓名</td><td>身份证号</td><td>登录名</td>" +
					"<td>状态</td><td>手机号</td></tr>");
			//3.遍历结果集,以表格形式输出数据
			while(rs.next()){
				int id = rs.getInt("account_id");
				String realName = rs.getString("real_name");
				String idcardNo = rs.getString("idcard_no");
				String loginName = rs.getString("login_name");
				String status=rs.getString("status");
				String strStatus="";
				if("1".equals(status)){
					strStatus="暂停";
				}else if("2".equals(status)){
					strStatus="删除";
				}else{
					strStatus="开通";
				}
				String telephone = rs.getString("telephone");
				out.println("<tr><td>"+
						id+"</td><td>"+
						realName+"</td><td>"+
						idcardNo+"</td><td>"+
						loginName+"</td><td>"+
						strStatus+"</td><td>"+
						telephone+"</td></tr>");
			}
			out.print("</table>");
			out.print("<a href='addAccount.html'>添加员工信息</a>");
			out.println("</BODY>");
			out.println("</HTML>");
			out.flush();
			out.close();
		}catch(Exception e){
			e.printStackTrace();
			out.println("系统繁忙,请稍后重试");
		}finally{
			if(conn!=null){
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
		
	}
}

web.xml文件完整代码:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!-- 课后练习 -->
	<servlet>
		<servlet-name>listAccountServlet</servlet-name>
		<servlet-class>web.ListAccountServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>listAccountServlet</servlet-name>
		<url-pattern>/listAccount</url-pattern>
	</servlet-mapping>
	
	<servlet>
		<servlet-name>addAccountServlet</servlet-name>
		<servlet-class>web.AddAccountServlet</servlet-class>
	</servlet>
		<servlet-mapping>
		<servlet-name>addAccountServlet</servlet-name>
		<url-pattern>/addAccount</url-pattern>
	</servlet-mapping>
</web-app>

day02_exec.sql文件完整代码如下所示:

create table account(
	account_id		number(9) constraint account_id_pk primary key,
	login_name		varchar2(30)  not null
							constraint account_login_name_uk unique,
	status			char(1)	constraint account_status_ck
						check (status in (0,1,2)) not null,
	real_name		varchar2(20)	not null,
	idcard_no		char(18)		not null
							constraint account_incard_no unique,
	telephone		varchar2(15) not null
);

insert into account
(account_id,login_name,status,real_name,idcard_no,telephone)
values(1001,'taiji001',1,'zhangsanfeng','410381194302256528',13669351234)
;

insert into account
(account_id,login_name,status,real_name,idcard_no,telephone)
values(1002,'mixue001',1,'mixue','410381194302256525',13669351233);

insert into account
(account_id,login_name,status,real_name,idcard_no,telephone)
values(1003,'syl001',1,'stone','410381194302256524',13669351235);
commit;

create sequence account_id_seq increment by 1 start with 1;

select * from account;