Jsp之四 servlet请求响应

简介: Jsp之四 servlet请求响应

读取请求(表单)的参数时,只需调用HttpServletRequest的getParameter方法,提供大小写敏感的参数名作为方法的参数。只要提供的参数名与html源代码中出现的参数名完全相同,就可以得到与终端用户的输入完全一致的结果。getParameter(String paraName)方法中如果参数存在但没有相应的值(如用户并没有填写相应的文本字段),则此方法返回一个“”的String;如果没有这样的参数存在,则返回null。注意:参数名的大小写是敏感的。如果同一参数名在表单数据中多次出现,则应该调用getParameterValues。如果参数只有单一的值,则返回只有一个元素的数组。实际上我们在设计html表单时,最好保证,每个文本字段,复选框以及其他用户界面有一个唯一的名称,但是多选列表框中每个选定的元素,重复使用了参数名,所以多个值的情况不是总可以避免的。下面看一个例子,清单【4-1】为html代码,【4-2】为Servlet代码

清单【4-1】

<!DOCTYPE HTML PUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN">
<html>
  <head>
    <title>MyHtml.html</title>  
    <meta http-equiv="keywords"content="参数,keyword2,keyword3">
    <meta http-equiv="description"content="this is my page">
    <!--  <meta http-equiv="content-type"content="text/html; charset=gbk">-->
    <!--<linkrel="stylesheet" type="text/css"href="./styles.css">-->
  </head>
  <body>
   <h1 align="center">这里定义三个参数</h1>
   <form action="ThreeParamsServlet"align="center">
   <center>
   第一个参数:<input type="text" name="param1"></br>
   第二个参数:<input type="text" name="param2"></br>
   第三个参数:<input type="text" name="param3"></br>
   </center>
   <center><input type="submit"value="提交"></center>
   </form>
  </body>
</html>


【4-2】

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 ThreeParamsServlet extends HttpServlet {
    public void doGet(HttpServletRequest req, HttpServletResponse res)
           throws ServletException, IOException {
       this.doPost(req, res);
    }
    public void doPost(HttpServletRequest req, HttpServletResponse res)
           throws ServletException, IOException {
       res.setContentType("text/html;charset=gbk");
       req.setCharacterEncoding("gbk");
       PrintWriter out = res.getWriter();
       String param1,param2,param3;
    //用Resquest类中的getParameter() 方法可以得到单一的参数值
       param1=req.getParameter("param1");
       param2=req.getParameter("param2");
       param3=req.getParameter("param3");    
       out.println("<!DOCTYPEHTML PUBLIC \"-//W3C//DTDHTML 4.01 Transitional//EN\">");
       out.println("<HTML>");
       out.println("  <HEAD><TITLE>AServlet</TITLE></HEAD>");
       out.println("  <BODY>");
        out.println("<ul>");
        out.println("<li>"+param1);
        out.println("<li>"+param2);
        out.println("<li>"+param2);
        out.println("</ul>");
       out.println("  </BODY>");
       out.println("</HTML>");
       out.flush();
       out.close();
    }
}


配置完web.xml后在地址栏中输入http://localhost:8080/servletdemo/MyHtml

即可看到如图【4-3】所示


点击提交之后就可看我们得到了三个参数,并把三个参数的值显示到页面上。


请求的响应


对请求的处理,通常都是通过HttpServletRequest 类中方法操作,而响应的内容都是通过HttpServletResponse类中的方法。


HttpServletResponse类中有一个从ServletResponse中继承的方法getWriter方法,调用此方法可以返回一个PrintWriter类的对象,用此对象的println()方法可以将输出的内容返回到客户端.

将请求传递给其他Servlet

我们使用RequestDispatcher接口中forward()方法可以将请求传递给其他的jsp或者Servlet,并且这一次请求与上一次的请求属于同一个请求


服务器端的重定向可以有两种方式,一是使用HttpServletResponse的sendRedirect()方法,一是使用RequestDispatcher的forward()方法.


HttpServletResponse.sendRedirect(“location”)方法将响应定向到参数location指定的、新的URL。location可以是一个绝对的URL,如response.sendRedirect("http://java.sun.com")也可以使用相对的URL。如果location以“/”开头,则容器认为相对于当前Web应用的根,否则,容器将解析为相对于当前请求的URL。这种重定向的方法,将导致客户端浏览器的请求URL跳转。从浏览器中的地址栏中可以看到新的URL地址,作用类似于上面设置HTTP响应头信息的实现。



RequestDispatcher.forward()方法将当前的request和response重定向到该RequestDispacher指定的资源。这在实际项目中大量使用,因为完成一个业务操作往往需要跨越多个步骤,每一步骤完成相应的处理后,转向到下一个步骤。比如,通常业务处理在Servlet中处理,处理的结果转向到一个JSP页面进行显示。这样看起来类似于Servlet链的功能,但是还有一些区别。一个RequestDispatcher对象可以把请求发送到任意一个服务器资源,而不仅仅是另外一个Servlet


我们看这样一个例子用【4-1】清单中的html页面作为一个请求页面,将清单【4-2】中的代码稍作更改如清单【4-4】所示,注意清单中加注颜色的代码,另外在加入一个清单【4-5】

清单【4-4】

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;
import javax.servlet.*;
public class ThreeParamsServlet extends HttpServlet {
    public void doGet(HttpServletRequest req, HttpServletResponse res)
           throws ServletException, IOException {
       this.doPost(req, res);
    }
    public void doPost(HttpServletRequest req, HttpServletResponse res)
           throws ServletException, IOException {
       res.setContentType("text/html;charset=gbk");
       req.setCharacterEncoding("gbk");
       PrintWriter out = res.getWriter();
          RequestDispatcherrd=req.getRequestDispatcher("ReqDispatcherServlet");
       String param1,param2,param3;
    //用Resquest类中的getParameter() 方法可以得到单一的参数值
       param1=req.getParameter("param1");
       param2=req.getParameter("param2");
       param3=req.getParameter("param3");    
/*     out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01Transitional//EN\">");
       out.println("<HTML>");
       out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
       out.println(" <BODY>");
       out.println("<ul>");
       out.println("<li>"+param1);
        out.println("<li>"+param2);
       out.println("<li>"+param2);
       out.println("</ul>");
       out.println(" </BODY>");
       out.println("</HTML>");
       out.flush();
       out.close();*/   
       rd.forward(req, res);
    }
}


清单【4-5】

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 ReqDispatcherServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
           throws ServletException, IOException {
       this.doPost(request, response);
    }
    public void doPost(HttpServletRequest req, HttpServletResponse res)
           throws ServletException, IOException {
       res.setContentType("text/html;charset=gbk");
       PrintWriter out = res.getWriter();
       String param1,param2,param3;
       //用Resquest类中的getParameter() 方法可以得到单一的参数值
           param1=req.getParameter("param1");
           param2=req.getParameter("param2");
           param3=req.getParameter("param3");
           out.println(param1+"  "+param2+"   "+param3+"  这是第二个Servlet中打印的内容");
    }
}


运行的结果如图【4-6】所示


程序的结果说明了在【4-1】中书写的参数,经过了第一个Servlet名字叫ThreeParamsServlet的处理,传递给了第二个Servlet名字叫做ReqDispatcherServlet并把这三个参数的信息打印出来,程序表明这样的请求可以理解为是同一个请求,在实际开发中经常用这样的技巧处理一些业务。


重定向到其他Servlet


HttpServletResponse.sendRedirect(“location”)方法将响应定向到参数location指定的、新的URL。location可以是一个绝对的URL,如response.sendRedirect("http://java.sun.com")也可以使用相对的URL。如果location以“/”开头,则容器认为相对于当前Web应用的根,否则,容器将解析为相对于当前请求的URL。这种重定向的方法,将导致客户端浏览器的请求URL跳转。从浏览器中的地址栏中可以看到新的URL地址。即用sendRedirect()方法相当于在客户端浏览上重新请求了服务器一样,是一个崭新的请求,所以原来请求所蕴含的参数就都没有了。


   需要注意的是,无论是RequestDispatcher.forward()方法还是HttpServletResponse.sendRedirect()方法,在调用这些方法进行重定向之前,都不能有向客户端的响应,即不能有out.println()语句的执行,否则就会有异常发生,并且重定向语句没有作用。

小结

本章主要学习了,页面与Servlet之间的访问,Servlet与Servlet之间的访问具体的内容有:


1、html表单的基本用法


2、HttpServletRequest.getParameter()方法的使用


3、RequestDispatcher接口的介绍


4、RequestDispatcher.forword方法的使用


5、HttpServletResponse.sentRedirect()方法的使用


目录
相关文章
|
3月前
|
JavaScript Java 容器
servlet过滤器Filter简要回顾-过滤请求字符编码,/和/*和/**的区别
本文简要回顾了Servlet过滤器Filter的概念和使用,通过实例演示了如何创建过滤器以过滤请求字符编码,并解释了在web.xml中配置过滤器时使用`/`、`/*`和`/**`的区别。
servlet过滤器Filter简要回顾-过滤请求字符编码,/和/*和/**的区别
|
2月前
|
Java 容器
【学习笔记】Jsp与Servlet技术
【学习笔记】Jsp与Servlet技术
82 0
|
2月前
|
XML JSON Java
探索研究JSP 客户端请求
【10月更文挑战第2天】
56 8
|
4月前
|
SQL Java 数据库
jsp中使用Servlet查询SQLSERVER数据库中的表的信息,并且打印在屏幕上
该博客文章介绍了在JSP应用中使用Servlet查询SQL Server数据库的表信息,并通过JavaBean封装图书信息,将查询结果展示在Web页面上的方法。
jsp中使用Servlet查询SQLSERVER数据库中的表的信息,并且打印在屏幕上
|
4月前
|
缓存 安全 Java
Java服务器端技术:Servlet与JSP的集成与扩展
Java服务器端技术:Servlet与JSP的集成与扩展
42 3
|
4月前
|
存储 缓存 前端开发
Servlet与JSP在Java Web应用中的性能调优策略
Servlet与JSP在Java Web应用中的性能调优策略
43 1
|
4月前
|
供应链 前端开发 Java
JSP+servlet+mybatis+layui服装库存管理系统(大三上学期课程设计)
这篇文章通过一个服装库存管理系统的实例,展示了在Spring Boot项目中使用Ajax、JSON、layui、MVC架构和iframe等技术,涵盖了注册登录、权限管理、用户管理、库存管理等功能,并提供了系统运行环境和技术要求的详细说明。
JSP+servlet+mybatis+layui服装库存管理系统(大三上学期课程设计)
|
4月前
|
存储 Java 关系型数据库
基于Servlet和JSP的Java Web应用开发指南
基于Servlet和JSP的Java Web应用开发指南
82 0
|
4月前
|
前端开发 安全 Java
在Java服务器端开发的浩瀚宇宙中,Servlet与JSP犹如两颗璀璨的明星,它们联袂登场,共同编织出动态网站的绚丽篇章。
在Java服务器端开发的浩瀚宇宙中,Servlet与JSP犹如两颗璀璨的明星,它们联袂登场,共同编织出动态网站的绚丽篇章。
31 0
|
6月前
|
存储 Java 关系型数据库
基于Servlet和JSP的Java Web应用开发指南
【6月更文挑战第23天】构建Java Web应用,Servlet与JSP携手打造在线图书管理系统,涵盖需求分析、设计、编码到测试。通过实例展示了Servlet如何处理用户登录(如`LoginServlet`),JSP负责页面展示(如`login.jsp`和`bookList.jsp`)。应用基于MySQL数据库,包含用户和图书表。登录失败显示错误信息,成功后展示图书列表。部署到Tomcat服务器测试功能。此基础教程为深入Java Web开发奠定了基础。
133 10