在Servlet中获取客户端通过表单等形式提交的请求参数值,并输出显示。
使用request对象的getParameter()方法获取请求中的name-value,使用request对象的getParameterValues()方法获取请求中的name-values。
步骤一:新建hello1.html页面
新建hello1.html页面,内容如图-1所示:
图– 1
该页面表单内容如图-2所示:
图 - 2
步骤二:新建Hello1Servlet类
新建Hello1Servlet.java文件,用于获取参数值及输出。
图 - 3
步骤三:修改web.xml文件
在web.xml文件中添加Hello1Servlet的映射
图 - 4
步骤四:部署并访问工程
部署工程后启动Tomcat,在浏览器中输入地址访问hello1.html页面,注意,本案例暂时只输入英文,查看服务器端获取参数值的输出结果。
helo1.html文件的代码如下:
<html> <head> </head> <body style="font-size:24px"> <form action="hello1" method="get"> Name:<input name="name"><br> Contact Me:<Br> QQ<input type="checkbox" name="contact" value="qq"/> Tel<input type="checkbox" name="contact" value="tel"/> WeChat<input type="checkbox" name="contact" value="wechat"/> <br> <input type="submit" value="OK"> </form> </body> </html>
Hello1Servlet.java文件的代码如下:
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 Hello1Servlet extends HttpServlet { /** * 获取请求中的name、contact两组参数值 * 分别使用getParameter和getParameterValues方法获取 */ protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { PrintWriter out = resp.getWriter(); //获取提交的name的值 String name = req.getParameter("name"); out.println("<h1>Hello," + name + "</h1>"); //获取提交的contact的值 String[] contacts = req.getParameterValues("contact"); if(contacts!=null){ out.print("<h1>Contact Information:</h1>"); for(String info :contacts){ out.print("<h1>"+info+"</h1>"); } } out.close(); } }
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>hello1Servlet</servlet-name> <servlet-class>web.Hello1Servlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>hello1Servlet</servlet-name> <url-pattern>/hello1</url-pattern> </servlet-mapping> </web-app>
查看客户端在提交请求参数值时,GET请求方式和POST请求方式的根本区别,即参数值的传递方式的区别。
使用MyEclipse自带的TCP/IP Monitor,以代理服务器的方式解析不同请求数据包中的请求行、消息头、主体的内容。
图 - 5
步骤一:新建代理服务器并启动TCP/IP Monitor
在MyEclipse中,按照如下步骤打开TCP/IP Monitor视图。
菜单“Windows”(“Show View”(“Other…”在搜索框中输入“TCP”就可看到该视图,选中后点击“OK”即可打开。如图-6:
图– 6
在该视图的空白处右键,点击“Properties”如图-7:
图– 7
在弹出的窗口中,按照如下图-8至图-10所示的顺序依次操作,完成Monitor的创建及启动。
图-8
图-9
图-10
步骤二:访问代理服务器,以GET方式提交表单数据
使用上一个案例中的表单来模拟提交数据即可。本次注意表单的method值为get。
<form action=“hello1” method=“get“>
启动Tomcat后,输入如下地址http://localshot:8888/day02/hello1.html
图– 11
填写表单数据后点击OK,查看Monitor中的数据包如图-12
图 -12
步骤三:访问代理服务器,以POST方式提交表单数据
修改表单的method值为post。
<form action=“hello1” method=“post“>
重新部署后,输入代理服务器地址http://localshot:8888/day02/hello1.html填写表单数据后点击OK后查看Monitor中的数据包如图-13
图- 13
步骤四:对比代理服务器中的数据包数据
对比图-12和图-13抓取的请求数据包可以看出,get方式和post方式在提交表单数据时的根本区别在于数据所处的位置。get方式参数值在请求资源路径的后面,从请求行汇总传递过来。post方式参数值出现在实体内容中,请求资源路径上不会出现任何多余信息,
表单以post方式提交中文数据到服务器端会出现乱码的现象,增加对乱码的处理,使得POST方式能够正确提交数据并显示。
为html页面增加meta标记,保证浏览器以支持中文编码方式打开页面。在服务器端的Servlet获取请求参数值时,按照与客户端相同的编码方式来解码,就可以实现正确获取,在输出流中同样设置与该编码方式相同格式来控制中文的输出显示。
步骤一:新建hello2.html页面并增加meta标记
新建hello2.html页面如下所示
图– 14
表单为post提交方式,文件源代码如下:
图 - 15
步骤二:新建Hello2Servlet.java文件
新建Hello2Servlet.java文件,添加request.setCharacterEncoding来设置取参数值之前的解码方式,为了保证输出中文,使用response.setContentType来设置content-type的消息头,从而控制浏览器的解码方式。
图 - 16
步骤三:修改web.xml文件
添加Hello2Servlet的映射,如图-17
图 - 17
步骤四:部署并访问工程
部署工程,启动服务,输入地址,并输入中文表单数据后查看结果。
图 - 18
hello2.html完整代码如下:
<html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8"> </head> <body style="font-size:24px"> <form action="hello2" method="post"> 姓名:<input name="name"><br> 联系方式:<Br> QQ<input type="checkbox" name="contact" value="qq"/> 电话<input type="checkbox" name="contact" value="tel"/> 微信<input type="checkbox" name="contact" value="wechat"/><br> <input type="submit" value="OK"> </form> </body> </html>
Hello2servlet.java完整代码如下:
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 Hello2Servlet extends HttpServlet { protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //保证正确读取post提交来的中文 req.setCharacterEncoding("utf-8"); //保证正确输出中文 resp.setContentType("text/html;charset=utf-8"); PrintWriter out = resp.getWriter(); //获取提交的name的值 String name = req.getParameter("name"); out.println("<h1>Hello," + name + "</h1>"); //获取提交的contact的值 String[] contacts = req.getParameterValues("contact"); if(contacts!=null){ out.print("<h1>联系方式:</h1>"); for(String contact :contacts){ out.print("<h1>"+contact+"</h1>"); } } out.close(); } }
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>hello2Servlet</servlet-name> <servlet-class>web.Hello2Servlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>hello2Servlet</servlet-name> <url-pattern>/hello2</url-pattern> </servlet-mapping> </web-app>
表单以get方式提交中文数据到服务器端会出现乱码的现象,增加对乱码的处理,使得get方式能够正确提交数据并显示。
为html页面增加meta标记,保证浏览器以支持中文编码方式打开页面。在服务器端的Servlet获取请求参数值时,按照iso-8859-1的方式获取字节码,再使用与客户端相同的编码方式来解码,
步骤一:新建hello2.html页面并增加meta标记
页面中的表单提交方式为get
图 - 19
步骤二:新建Hello2Servlet.java文件
表单提交到的Servlet中需要按照ios-8859-1的方式获取字节码,再将此字节码按照UTF-8方式的解码。
图 - 20
步骤三:修改web.xml文件
与图-17一致。
步骤四:部署并访问工程
部署并访问工程,输入中文姓名查看结果及地址栏。
图 - 21
hello2.html文件完整代码:
<html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8"> </head> <body style="font-size:24px"> <form action="hello2" method="get"> 姓名:<input name="name"><br> 联系方式:<Br> QQ<input type="checkbox" name="contact" value="qq"/> 电话<input type="checkbox" name="contact" value="tel"/> 微信<input type="checkbox" name="contact" value="wechat"/><br> <input type="submit" value="OK"> </form> </body> </html>
Hello2Servlet.java文件代码如下:
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 Hello2Servlet extends HttpServlet { protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //保证正确输出中文 resp.setContentType("text/html;charset=utf-8"); PrintWriter out = resp.getWriter(); //获取提交的name的值 String name = req.getParameter("name"); //保证正确读取get提交来的中文 name = new String(name.getBytes("iso-8859-1"),"UTF-8"); out.println("<h1>Hello," + name + "</h1>"); //获取提交的contact的值 String[] contacts = req.getParameterValues("contact"); if(contacts!=null){ out.print("<h1>联系方式:</h1>"); for(String contact :contacts){ out.print("<h1>"+contact+"</h1>"); } } out.close(); } }
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>hello2Servlet</servlet-name> <servlet-class>web.Hello2Servlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>hello2Servlet</servlet-name> <url-pattern>/hello2</url-pattern> </servlet-mapping> </web-app>
编写工程实现收集员工姓名、薪水、年龄信息,将数据提交到服务器后,服务器能够正确获取参数值并输出显示,要求能够支持中文。
制作表单用于获取用户输入,选择post方式提交数据,添加meta标签控制浏览器的编码方式。服务器端增加Servlet用于获取请求参数值,添加用于处理中文乱码的setCharaterEncoding,实现正确解码。使用setContentType实现中文的正确输出。
步骤一:新建addEmp.html页面
新建addEmp.html页面效果如图-22所示
图– 22
addEmp.html页面的表单如下:
图 - 23
步骤二:新建AddEmpServlet类
新建AddEmpServlet类,使用request.setCharacterEncoding("UTF-8")及response.setContentType("text/html;charset=UTF-8")来保证正确获取中文,正确输出中文。
图- 24
步骤三:修改web.xml文件
修改web.xml文件,为AddEmpServlet添加映射,如图-25
图 - 25
步骤四:部署及访问应用
部署应用,启动Tomcat,输入访问addEmp.html的页面地址,输入中文,点击提交,查看运行结果。
图 - 26
addEmp.html文件完整代码:
<html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8"> </head> <body style="font-size:24px"> <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>
AddEmpServlet.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 AddEmpServlet 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 name = request.getParameter("name"); double salary = Double.valueOf(request.getParameter("salary")); int age = Integer.valueOf(request.getParameter("age")); out.print("<h1>员工信息</h1>"); out.print("<h1>姓名:" + name + "</h1>"); out.print("<h1>薪水:" + salary + "</h1>"); out.print("<h1>年龄:" + age + "</h1>"); out.close(); } }
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>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>
将客户端提交的员工信息,使用JDBC的技术插入到t_emp表中。
首先在Oracle中建立一个名字叫t_emp的表,包括id,name,salary,age四个字段,id为主键字段,并实现自增。在处理表单信息的Servlet中,使用JDBC技术完成连接数据库,并使用获取的请求参数值构建insert语句,执行后完成员工信息的增加操作。操作成功或失败均返回给用户响应的提示信息。
步骤一:使用MyEclipse的DB Browser视图连接Oracle数据库
使用如下步骤打开DB Browser视图
菜单“window”(“Show View”(“Other…”在搜索栏输入DB,选择“DB Browser“后点击ok即可。在视图中右键选择new,创建一个新的连接,配置如图-27,图-28
图 - 27
图- 28
连接数据库正确后,点击新创建的这个连接,右键 Open Connection即可查看连接情况如图-29
图- 29
步骤二:执行SQL语句创建t_emp表
在工程节点下,右键新建一个名字叫做day02.sql的文件,在该文件中编写建表脚本。如图-30,图-31
图– 30
图- 31
在sql文件中,编写完sql语句后,为了执行,可以选中,然后点击连接左边的绿色按钮,即代表执行。为了查看表是否创建,可以在执行完以后到DB Browser视图中,打开对应的连接,查看下面的table节点下是否有更新。
表创建成功之后,继续在sql文件中编写insert语句,选中后执行。为了查看表内的数据,再编写select * from t_emp语句。结果的查看可以通过菜单“Window” ( “show View” ( “Other…”,在搜索栏中填写SQL后,选中SQL Result视图,点击确定,即可打开视图看见select语句的执行结果。过程如图-32,图-33所示
图– 32
图– 33
步骤三:新建addEmp.html页面
建立addEmp.html页面如下
图– 34
步骤四:新建AddEmpServlet.java类
编写有关数据库操作的代码,如图-35
图– 35
在编写JDBC代码时,需要加载驱动jar包,否则Class.forName会报错。在web Project中添加jar包,只需要将文件拷贝,在lib文件夹下右键粘贴即可,工程会自动增加对jar包的构建。
如图-36为添加了驱动jar包后效果
图- 36
步骤五:添加AddEmpServlet的映射
图-37
步骤六:部署应用,访问addEmp.html页面,查看结果
部署应用,访问addEmp.html页面填写中文数据后点击提交。可以到SQL Result界面中通过执行查询语句确认增加操作是否执行成功。结果参考图-38,图-39
图- 38
图- 39
addEmp.html文件完整代码:
<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>
AddEmpServlet.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 AddEmpServlet 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 name = request.getParameter("name"); double salary = Double.valueOf(request.getParameter("salary")); int age = Integer.valueOf(request.getParameter("age")); //将数据插入到数据库t_emp表中 Connection conn = null; PreparedStatement stat = null; try { Class.forName("oracle.jdbc.OracleDriver"); conn = DriverManager.getConnection( "jdbc:oracle:thin:@localhost:1521:xe", "xxxx", "xxxx"); stat = conn.prepareStatement("insert into t_emp values" + "(emp_id_seq.nextval,?,?,?)"); stat.setString(1, name); stat.setDouble(2, salary); stat.setInt(3, age); stat.executeUpdate(); out.println("添加成功"); } 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>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>
day02.sql文件完整代码:
create table t_emp( id number(4) primary key, name varchar2(20), salary number(7,2), age number(3) ) create sequence emp_id_seq increment by 1 start with 1 insert into t_emp values(emp_id_seq.nextval,'Lisa',3000.00,20) insert into t_emp values(emp_id_seq.nextval,'花儿',3000.00,20) insert into t_emp values(emp_id_seq.nextval,'少年',3000.00,20) select * from t_emp
客户端访问服务器后可以返回t_emp表中所有数据的表格展示,效果如图-40:
图- 40
在处理请求的Servlet中,使用JDBC技术实现数据库的访问,并且在遍历结果集时,将结果与html的表格行、列标签进行连接,生成符合表格样式的标记后输出到客户端。
步骤一:新建ListEmpServlet.java文件
在ListEmpServlet类中,使用JDBC技术连接数据库,并执行查询语句,对查询结果集遍历后,以表格形式输出。如图-41
图- 41
步骤二:添加ListEmpServlet映射
修改web.xml文件,添加映射,如图-42
图- 42
步骤三:部署及访问应用
部署后,在浏览器地址栏输入地址http://localhost:8080/应用名/list,查看结果是否与图-40一致。
ListEmpServlet.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 ListEmpServlet 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:xe", "xxxx", "xxxx"); stat = conn.prepareStatement("select * from t_emp"); 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></tr>"); //3.遍历结果集,以表格形式输出数据 while(rs.next()){ int id = rs.getInt("id"); String name = rs.getString("name"); double salary = rs.getDouble("salary"); int age = rs.getInt("age"); out.println("<tr><td>"+ id+"</td><td>"+ name+"</td><td>"+ salary+"</td><td>"+ age+"</td></tr>"); } out.print("</table>"); out.print("<a href='addEmp.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>addEmpServlet</servlet-name> <servlet-class>web.AddEmpServlet</servlet-class> </servlet> <servlet> <servlet-name>listEmpServlet</servlet-name> <servlet-class>web.ListEmpServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>addEmpServlet</servlet-name> <url-pattern>/add</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>listEmpServlet</servlet-name> <url-pattern>/list</url-pattern> </servlet-mapping> </web-app>