写在前面

继续学习Java Servlet,这一部分学习URL重写,虽然这些技术用的不多,而且代码也比较简单,但是我还是决定一节一节的记录。仔细看看示例代码还是有很多内容。

URL重写

URL重写是一种会话跟踪技术, 它将一个或多个token添加到URL的查询字符串中, 每个token通常为key=value形式, 如下:

url?key-1=value-1&key-2=value-2 ... &key-n=value-n

注意, URL和tokens间用问号(? ) 分割, token间用与号(&) 。

URL重写适合于tokens无须在太多URL间传递的情况下, 然而它有如下限制:

  • URL在某些浏览器上最大长度为2000字符;
  • 若要传递值到下一个资源, 需要将值插入到链接中, 换句话说, 静态页面很难传值;
  • URL重写需要在服务端上完成, 所有的链接都必须带值, 因此当一个页面存在很多链接时, 处理过程会是一个不小的挑战;
  • 某些字符, 例如空格、 与和问号等必须用base64编码;
  • 所有的信息都是可见的, 某些情况下不合适。

因为存在如上限制, URL重写仅适合于信息仅在少量页面间传递, 且信息本身不敏感。

示例代码

下面将构造一个Top10Servlet类会显示最受游客青睐的10个伦敦和巴黎的景点。 信息分成两页展示, 第一页展示指定城市的5个景点, 第二页展示另外5个。 该Servlet使用URL重写来记录所选择的城市和页数。 该类扩展自HttpServlet, 并通过/top10访问。

package app02a.urlrewriting;import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@WebServlet(name = "Top10Servlet", urlPatterns = { "/top10" })
public class Top10Servlet extends HttpServlet {private static final long serialVersionUID = 987654321L;private List<String> londonAttractions;private List<String> parisAttractions;@Overridepublic void init() throws ServletException {londonAttractions = new ArrayList<String>(10);londonAttractions.add("Buckingham Palace");londonAttractions.add("London Eye");londonAttractions.add("British Museum");londonAttractions.add("National Gallery");londonAttractions.add("Big Ben");londonAttractions.add("Tower of London");londonAttractions.add("Natural History Museum");londonAttractions.add("Canary Wharf");londonAttractions.add("2012 Olympic Park");londonAttractions.add("St Paul's Cathedral");parisAttractions = new ArrayList<String>(10);parisAttractions.add("Eiffel Tower");parisAttractions.add("Notre Dame");parisAttractions.add("The Louvre");parisAttractions.add("Champs Elysees");parisAttractions.add("Arc de Triomphe");parisAttractions.add("Sainte Chapelle Church");parisAttractions.add("Les Invalides");parisAttractions.add("Musee d'Orsay");parisAttractions.add("Montmarte");parisAttractions.add("Sacre Couer Basilica");}@Overridepublic void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String city = request.getParameter("city");if (city != null && (city.equals("london") || city.equals("paris"))) {// show attractionsshowAttractions(request, response, city);} else {// show main pageshowMainPage(request, response);}}private void showMainPage(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException {response.setContentType("text/html");PrintWriter writer = response.getWriter();writer.print("<html><head>" +"<title>Top 10 Tourist Attractions</title>" +"</head><body>" +"Please select a city:" +"<br/><a href='?city=london'>London</a>" +"<br/><a href='?city=paris'>Paris</a>" +"</body></html>");}private void showAttractions(HttpServletRequest request, HttpServletResponse response, String city)throws ServletException, IOException {int page = 1;String pageParameter = request.getParameter("page");if (pageParameter != null) {try {page = Integer.parseInt(pageParameter);} catch (NumberFormatException e) {// do nothing and retain default value for page}if (page > 2) {page = 1;}}List<String> attractions = null;if (city.equals("london")) {attractions = londonAttractions;} else if (city.equals("paris")) {attractions = parisAttractions;}response.setContentType("text/html");PrintWriter writer = response.getWriter();writer.println("<html><head>" +"<title>Top 10 Tourist Attractions</title>" +"</head><body>");writer.println("<a href='top10'>Select City</a> ");writer.println("<hr/>Page " + page + "<hr/>");int start = page * 5 - 5;for (int i = start; i < start + 5; i++) {writer.println(attractions.get(i) + "<br/>");}writer.print("<hr style='color:blue'/>" +"<a href='?city=" + city +"&page=1'>Page 1</a>");writer.println("&nbsp; <a href='?city=" + city +"&page=2'>Page 2</a>");writer.println("</body></html>");}
}

函数功能说明

1.init()函数。仅当该servlet第一次被用户访问时调用,构造两个类级别的列表, londonAttractions和
parisAttractions, 每个列表有10个景点。

2.doGet()函数。该方法每次请求时被调用, 检查URL中是否包括请求参数city, 并且其值是否为“london”或“paris”, 方法据此决定是调用showAttractions方法还是showMainPage方法。

3.showMainPage()函数。向浏览器发送主页面,提供两个链接选择,一个链接显示城市London,另一个链接显示城市Paris。

4.showAttractions()函数。向浏览器发送展示城市景点的页面。

程序运行过程说明

通过URL调用Servlet之后,首先由于该servlet第一次被用户访问,会调用init()函数。

由于用户一开始访问该servlet时不带任何请求参数, 此时调用showMainPage, 该方法发送两个链接到浏览器, 每个链接都包含token: city=cityName:

"Please select a city:" +
"<br/><a href='?city=london'>London</a>" +
"<br/><a href='?city=paris'>Paris</a>" +

请注意a元素中的href属性, 该属性值包括一个问号加token city=london或city=paris. 注意, 此处为相对URL, 即URL中没有协议部分, 相对于当前页面。 因此, 若你点击了任一链接, 则会提交:

http://localhost:8080/app02a/top10?city=london

http://localhost:8080/app02a/top10?city=paris

到服务器上。

用户点击两个链接中的一个之后,就会向Servlet发送请求,会调用doGet()函数,而该函数会识别请求参数的city值并传递给showAttractions方法, 该方法会检查URL中是否包含page参数, 如果没有该参数或该参数值无法转换为数字, 则该方法设定page参数值为1, 并将头5个景点发给客户端。

showAttractions方法还发送了3个链接到客户端:Select City、 Page 1和Page 2。 Select City 是无参数访问servlet, Page 1和Page 2链接包括两个tokens, 即city和page:

http://localhost:8080/app02a/top10?city=cityName&page=pageNumber

若选择了伦敦, 并点击了Page 2, 则将以下URL发送给服务端:

http://localhost:8080/app02a/top10?city=london&page=2

写在后面

不同页面之间的跳转我一直很好奇,但通过这个程序发现这个程序就是通过发送href来实现不同页面的跳转的。先记录这么多。

Java Servlet学习笔记——3.URL重写相关推荐

  1. java Servlet学习笔记

    前言:开始学习java web了,选择一本java Web整合开发王者归来作为我的学习图书,我觉的光看是不管用的,还要把书上的代码实践一下,通过写学习笔记的形式,加快自己对于java的理解,加油. 学 ...

  2. java Servlet学习笔记(一)

    访问机制 (https://pan.baidu.com/share/link?shareid=3055126243&uk=3355579678&fid=1073713310362078 ...

  3. 尚学堂JAVA高级学习笔记_1/2

    尚学堂JAVA高级学习笔记 文章目录 尚学堂JAVA高级学习笔记 写在前面 第1章 手写webserver 1. 灵魂反射 2. 高效解析xml 3. 解析webxml 4. 反射webxml 5. ...

  4. java web学习笔记(持续更新)

    java web学习笔记 一.Java Web简介 二.认识Servlet 1.什么是Servlet? 2.请求路径 3.tomcat 4.Servlet的使用 三.Servlet简单应用 1.创建S ...

  5. 尚学堂JAVA基础学习笔记_2/2

    尚学堂JAVA基础学习笔记_2/2 文章目录 尚学堂JAVA基础学习笔记_2/2 写在前面 第10章 IO技术 1. IO入门 2. IO的API 3. 装饰流 4. IO实战 5. CommonsI ...

  6. java mail 学习笔记

    JAVA MAIL 学习 笔记 电子邮件协议的简介 SMTP 简单邮件传输 SMTP是Simple Mail Transfer Protocol的简称,即简单邮件传输协议.该协议定义了邮件客户端软件和 ...

  7. 黑马程序员Java教程学习笔记(五)

    学习视频:https://www.bilibili.com/video/BV1Cv411372m 如侵权,请私信联系本人删除 文章目录 黑马程序员Java教程学习笔记(五) 日期时间:Date.Sim ...

  8. 【Java】学习笔记2——从小白到入门(技术提升篇)

    写在前面 [Java]学习笔记1--从小小白到小白 (基础知识篇)里记录了Java中最最基础的知识,在对基础知识有了基本了解之后,就可以开始着手技术提升了.本篇博客也将延续第一篇,继续记录我的Java ...

  9. Servlet学习笔记 Servlet原理

    Servlet学习笔记 Servlet原理 一.Servlet基础 1.Servlet执行过程 用户请求一个Servlet,Servlet容器自动构建请求和响应对象,然后执行Servlet的servi ...

最新文章

  1. mysql2013年8月怎么打出来_2020年8月31日,上周完成了一个查询接口来检查mysql的数据,速度很慢,20200831,从,MySQL,中查,贼...
  2. 预训练永不止步,游戏问答语言模型实操
  3. 苹果推送iOS 14.3,支持 ProRAW!
  4. 2字段添加注释_2w字长文给你讲透了配置类为什么要添加 @Configuration注解
  5. 学习手记——技术博文汇总(持续更新)
  6. samba服务器的设置
  7. 第四十二章 SQL函数 DATEADD
  8. RestClient查询文档
  9. 通过图片url 获取图片file对象
  10. linux c如何判断字符串是否为空
  11. 12月10日 - 最新一大波迅雷看看白金迅雷钻石·VIP7的会员帐号来袭
  12. 让你相见恨晚的Photoshop 技巧
  13. 腾讯代码被外包私传到网上,程序员小哥气爆炸,网友:求地址!
  14. 计算几何(二) by邓俊辉老师
  15. 游戏直播视频太大了,怎么一键压缩视频?--QVE视频压缩
  16. 尚融宝——阿里云短信验证功能(sms)
  17. 数据挖掘十大经典算法个人总结
  18. html链接ppt,PPT超链接的各种使用方法
  19. 关于Unity打不开弹出“由于找不到MSVCP140.dll,无法继续执行代码,重新安装程序可能会解决此问题”解决方案
  20. [转] 公共DNS,114.114.114.114和8.8.8.8

热门文章

  1. OffsetOutOfRangeException: Offsets out of range with no configured reset policy for partitions
  2. OLED屏显示电池电量设计
  3. 华为盒子EC6110-M、EC6110-T(3798mv310芯片)强刷固件及教程
  4. 构建容器Nginx+Tomcat+MySQL
  5. pmap学习:系统测试中怎么确定内存泄露(memory leak)
  6. MODBUS通讯的C语言实现与简单讲解
  7. Java实现 蓝桥杯VIP 算法训练 矩阵加法
  8. eclipse的安装以及JAVA的基本学习第一部分
  9. 当下主流浏览器IE6、IE7 、IE8、Firefox、Chrome、Safari、Opera
  10. 【uniapp】实现小程序底部弹框带动画以及隐藏底部栏tab