《web软件技术》课程实验二 )
- 格式:doc
- 大小:168.00 KB
- 文档页数:12
《Web软件技术》课程
实验报告
题目 HTTP请求对及数据处理
专业信息工程
班级信工143
学号 10141463
姓名王钊健
指导教师签名范贵生
华东理工大学信息学院计算机系
2017年03月03日
实验二HTTP请求对及数据处理
姓名王钊健学号 10141463 专业班级信工143 成绩_________
实验日期 2017/3/2 实验地点信息大楼 215 指导教师(签名)
一.实验目的
1. 掌握如何获得请求参数;
2. 掌握如何检索请求头;
3. 了解如何通过请求对象获得客户信息;
4. 重点掌握使用请求对象存储数据和请求转发。
二.实验工具与设备
三.实验内容
(一)通过查询串传递请求参数,并在Servlet中检索请求参数
【步骤1】编写下面的Servlet。
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloUserServlet extends HttpServlet{
public void service(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException{
String userName = request.getParameter("userName");
PrintWriter pw = response.getWriter();
pw.println("<html>");
pw.println("<head>");
pw.println("</head>");
pw.println("<body>");
pw.println("<h3>Hello, " + userName + "</h3>");
pw.println("</body>");
pw.println("</html>");
}
}
【步骤2】使用下面的URL访问之。
http://localhost:8080/helloapp/hellouser?userName=John
将userName的值改为你自己的名字,看输出结果。
若不给出查询字符串,结果如何?参数值使
用汉字如何?
(二)通过表单传递请求参数,使用HttpServletRequest对象获得请求参数
【步骤1】首先编写一个input.html文件,存放在helloapp目录中。
该页面在屏幕上显示一个表单,其中包括姓名和年龄域,点击“确定”按钮后,将表单参数传递给ParamServlet并显示出来。
input.html代码如下:
<html>
<head><title>参数传递</title>
<meta http-equiv="Content-Type" content="text/html;charset=gb2312">
</head>
<body>
<center>
<h3>从表单向Servlet传递参数</h3>
<form method="GET" action="paramtest" >
姓名:<input type="text" name="name"><br>
年龄:<input type="text" name="age"><br>
<input type="submit" value="确定" >
<input type="reset" value="重置" >
</form>
<center>
</body>
</html>
【步骤2】编写ParamServlet.java,其代码如下:
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class ParamServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
response.setCharacterEncoding("gb2312");
response.setContentType("text/html;charset=gb2312");
String name = request.getParameter("name");
name = new String(name.getBytes("iso8859-1"),"gb2312");
String age = request.getParameter("age");
age = new String(age.getBytes("iso8859-1"),"gb2312");
PrintWriter pw = response.getWriter();
pw.println("<html>");
pw.println("<head>");
pw.println("</head>");
pw.println("<body>");
pw.println("<h3>姓名:"+name+"</h3><p>");
pw.println("<h3>年龄:"+age+"</h3><p>");
pw.println("</body>");
pw.println("</html>");
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
doGet(request, response);
}
}
【步骤3】测试参数传递。
在浏览器的地址栏中输入:http://localhost:8080/helloapp/input.html。
输入数据,点击“确定”按钮,体会表单参数的传递。
问题1:如何通过超链接的锚标签(<a href>)传递请求参数?
(三)编写一个程序实现文件上传功能。
假设学生上传作业,需要执行学号和上传的文件。
as11.java:
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
@WebServlet(name="as11",urlPatterns={"/fileUpload.do"})
@MultipartConfig(location="D:\\",fileSizeThreshold=1024)
public class as11 extends HttpServlet{
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException,IOException{
// 返回Web应用程序文档根目录
String path = this.getServletContext().getRealPath("/");
String mnumber = request.getParameter("mnumber");
Part p = request.getPart("fileName");
String message="";
if(p.getSize() >1024*1024){ // 上传的文件不能超过1MB大小
p.delete();
message = "文件太大,不能上传!";
}else{
path = path + "\\member\\" +mnumber;
File f = new File(path);
if( !f.exists()){ // 若目录不存在,则创建目录
f.mkdirs();
}
String h = p.getHeader("content-disposition");
// 得到文件名
String fname = h.substring(stIndexOf("\\")+1, h.length()-1);
p.write(path + "\\"+ fname);
message = "文件上传成功!";
}
request.setAttribute("message", message);
RequestDispatcher rd = request.getRequestDispatcher("/fileUpload.jsp"); rd.forward(request, response);
}
}
fileUpload.jsp:
<%@page contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type"content="text/html; charset=UTF-8">
<title>上传文件</title></head>
<body>
${message}<br>
<form action="as11"enctype="multipart/form-data"
method="post">
<table>
<tr><td colspan="2"align="center">文件上传</td>
</tr>
<tr><td>会员号:</td>
<td><input type="text"name="mnumber"size="30"/></td> </tr>
<tr><td>文件名:</td>
<td><input type="file"name="fileName"size="30"/></td> </tr>
<tr>
<td align="right"><input type="submit"value="提交"/></td>
<td align="left"><input type="reset"value="重置"/></td> </tr>
</table>
</form>
</body>
</html>
xml文件部分代码:
(四)简单的综合应用<?xml version="1.0"encoding="UTF-8"?>
<web-app xmlns:xsi="/2001/XMLSchema-instance" xmlns="/xml/ns/javaee"
xsi:schemaLocation="/xml/ns/javaee
/xml/ns/javaee/web-app_2_5.xsd"id="WebApp_ID" version="2.5">
<display-name>ss</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<description></description>
<display-name>FirstServlet</display-name>
<servlet-name>FirstServlet</servlet-name>
<servlet-class>com.demo.FirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FirstServlet</servlet-name>
<url-pattern>/FirstServlet</url-pattern>
</servlet-mapping>
<servlet>
<description></description>
<display-name>SecondServlet</display-name>
<servlet-name>SecondServlet</servlet-name>
<servlet-class>com.demo.SecondServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SecondServlet</servlet-name>
<url-pattern>/SecondServlet</url-pattern>
</servlet-mapping>
</web-app>
【步骤1】创建一个名为input.html的HTML页面,其中包括一个表单,表单中包含两个文本域,分别供用户输入学号和姓名,该页面也包含提交和重置按钮。
【步骤2】定义一个名为com.demo.Student类,其中包括学号sno和姓名name两个private 的成员变量,定义访问和修改sno和name的方法。
【步骤3】编写名为FirstServlet的Servlet,要求当用户在input.html中输入信息后点击“提交”按钮,请求FirstServlet对其处理。
在FirstServlet中使用表单传递的参数(学号和姓名)创建一个Student对象并将其作为属性存储在请求对象中,然后获得通过请求对象的getRequestDispatcher()方法获得RequestDispatcher()对象,将请求转发到SecondServlet。
【步骤4】在SecondServlet中取出请求对象上存储的Student对象,并显示输出该学生的学号和姓名。
在SecondServlet的输出中应该包含一个超链接,点击该连接可以返回input.html页面。
图2.1 input.html页面显示结果图2.2 SecondServlet显示结果
Input.html:
<!DOCTYPE html>
<html>
<head><title>Login Page</title></head>
<body>
<form action="FirstServlet"method="post">
<table width="298"border="0"align="center"
cellpading="2"cellspacing="1">
<tr>
<td align="right">学号:</td>
<td align="left"><input type="text"name="snumber"size="15"></td>
</tr>
<tr>
<td align="right">姓名:</td>
<td><input type="text"name="sname"size="15"></td>
</tr>
<tr>
<td colspan="2"align="center"><input type="submit"value="登录"> <input type="reset"value="取消"></td>
</tr>
</form>
</body>
</html>
Student.java:
package com.demo;
public class Student {
private String sno;
private String name;
public Student(String sno,String name){
super();
this.sno=sno;
=name;
}
public Student(){
super();
}
public String getSno(){
return sno;
}
public void setSno(String sno){
this.sno=sno;
}
public String getName(){
return name;
}
public void setName(String name){
=name;
}
}
FirstServlet.java:
package com.demo;
import java.io.*;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import com.demo.Student;
@WebServlet(name="FirstServlet",urlPatterns="/first") public class FirstServlet extends HttpServlet { /**
*
*/
private static final long serialVersionUID = 1L; ServletContext context;
public void init(){
context = getServletContext();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException{
request.setCharacterEncoding("gb2312");
String snumber = request.getParameter("snumber");
String sname = request.getParameter("sname");
Student stud = new Student(snumber,sname);
request.setAttribute("stud",stud);
RequestDispatcher view =
request.getRequestDispatcher("/SecondServlet");
view.forward(request, response);
}
}
SecondServlet.java:
package com.demo;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import com.demo.Student;
public class SecondServlet extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = 1L; ServletContext context;
public void init(){
context = getServletContext();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException{
Student stud = (Student)request.getAttribute("stud");
response.setContentType("text/html;charset=gb2312");
PrintWriter out = response.getWriter();
out.println("<html><body>");
out.println("<center>");
out.println("学号:"+stud.getSno()+"<br>");
out.println("姓名:"+stud.getName()+"<br>");
out.println("<a href=\"/ss/input.html\">返回输入页面</a>");
out.println("</center>");
out.println("</body></html>");
}
}
Web.xml:
<?xml version="1.0"encoding="UTF-8"?>
<web-app xmlns:xsi="/2001/XMLSchema-instance"
xmlns="/xml/ns/javaee"
xsi:schemaLocation="/xml/ns/javaee
/xml/ns/javaee/web-app_2_5.xsd"id="WebApp_ID"
version="2.5">
<display-name>ss</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>FirstServlet</servlet-name>
<servlet-class>com.demo.FirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FirstServlet</servlet-name>
<url-pattern>/FirstServlet</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>SecondServlet</servlet-name>
<servlet-class>com.demo.SecondServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SecondServlet</servlet-name>
<url-pattern>/SecondServlet</url-pattern>
</servlet-mapping>
</web-app>
四. 实验体会(包括收获、心得体会、存在的问题及解决问题的方法、建议等)
通过本次实验,对HTTP请求对及数据处理有了一定的了解和掌握,对java web编程更加熟悉。
比较容易出现404的问题,通过学习与仔细观察,处理问题的能力得到了一定的增强。
五.思考题
1. 在Servlet中如何获得请求参数?
答:web组件之间参数传递有3种方式:
(1)request.getParameter("name");
a、通过超链接
b、通过表单
c、通过servlet转发或重定向
d、通过隐藏域完成
(2)pageContext.getAttribute("key"); //页面范围
request.getAttribute("key"); //请求转发范围只能通过来转发请求
session.getAttribute("key"); //浏览器范围
//直接在任何jsp或这servlet中通过session来获取
application.getAttribute("key"); //容器范围
//直接在任何jsp或这servlet中通过application或者servletContext来获取
(3)Cookie
2. 如何实现请求转发?如何在请求对象中共享数据?
jsp : request.getRequestDispatcher("/*.jsp").forward(request,response); servlet:sendRedirect()方法原理:
1,客户端发送请求,Servlet1做出处理。
2,Servlet1调用sendReadirect()方法,将客户端的请求重新定位到Servlet2。
3,客户端浏览器访问Servlet2.
4,Servlet2对客户端浏览器做出响应。
forward()方法原理:
1,客户端发送请求,Servlet1做出处理。
2,Servlet调用forward()方法,将请求转发给Servlet2来处理请求,为客户端服务.
3,Servlet2对客户端浏览器做出响应。
<jsp:forward/>或<jsp:include/>
request.getRequstDispatcher("").forward();
request.getRequstDispatcher("").include();。