参考答案
GET和POST的区别如下:
1. 从提交的数据量上来说,get方式会将请求参数及参数值放在请求资源路径里面,携带的数据大小有限制,不适合提交大量的数据;post方式会将请求参数及参数值放在实体内容里面,理论上没有限制,适合大量数据的提交。
2.从安全上来讲,post方式相对安全(因为请求参数及值存放在实体内容里面,而get方式会将请求参数及值显示在浏览器地址栏)。但是要注意,post方式并没有将数据加密。
参考答案
处理表单提交的中文,分为两种情况,一是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”);
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输出中文无乱码。
将客户端提交的帐务帐号信息,使用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;
客户端访问服务器后可以返回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;