Servlet JSP和Spring MVC初学指南

本文是一篇关于Servlet、JSP和Spring MVC的初学者指南,详细介绍了Servlet的生命周期、会话管理,以及Spring MVC的基础知识。文中提到了Servlet在服务器中的运行方式,JSP与Servlet的关系,以及Spring MVC作为Web应用开发的模块。同时,文章讨论了会话管理技术,包括URL重写、隐藏域、Cookies和HTTPSession对象。另外,还涵盖了JSP的JSTL标签库、自定义标签、监听器、过滤器、安全和部署等方面,最后探讨了Spring MVC的Controller、数据绑定、验证和文件上传下载等核心概念。
摘要由CSDN通过智能技术生成

最近系统学习了下servlet,JSP和spring MVC的知识,推荐一本入门参考书《Servlet、JSP和Spring MVC初学指南》,作者是加拿大人Budi Kurniawan和美国人Paul Deck,林仪民、俞黎敏译。该书共24章,主要分为两部分,第一部分讲解Servlet的相关知识;第二部分讲解Spring MVC。书中每一章中都配有代码,可以对着书本敲一下,加深理解。
首先,什么是Servlet?
Servlet是在服务器上运行的小程序.Servlet的主要功能在于交互式的浏览和修改数据,生产动态Web内容.它是Java开发Web应用的底层技术.Servlet创建后(处理第一个请求时)就一直保持在内存中.JSP是构建在Java Web应用程序上第二种技术,是Servlet技术的补充,而不是取代Servlet技术。JSP(Java Server Pages)是一种动态网页开发技术,它使用JSP标签在HTML网页中插入java代码,标签通常以<%开头,以%>结束.JSP是一种Java servlet,主要用于实现Java web应用程序的用户界面部分.网页开发者们通过结合HTML代码\XHTML代码\XML元素以及嵌入JSP操作和命令来编写JSP.
JSP页面会被转换和编译成Servlet程序.JSP与纯Servlet相比,JSP可以很方便的编写或者修改HTML网页而不用去面对大量的println语句.与JavaScript相比,虽然JavaScript可以在客户端动态生成HTML,但是很难与服务器交互,因此不能提供复杂的服务,比如访问数据库和图像处理等.
Servlet应用无法独立运行,必须运行在Servlet容器中.Servlet容器将用户的请求传递给Servlet应用,并将结果返回给用户.Apache Tomcat和Jetty是当前最流行的servlet/JSP容器.由于大部分Servlet应用都帮多个JSP页面,因此更准确的说是"Servlet/JSP应用"

Servlet/JSP应用的架构
这个过程为:
1.客户端发送请求至服务器端;
2.服务器将请求信息发送给Servlet;
3.Servlet生产响应内容并将其传给服务器.响应内容动态生成,通常取决于客户端的请求;
4.服务器将响应内容返回给客户端.
其次,Servlet的生命周期是怎样的?
1.客户端请求该Servlet;
2.加载Servlet类到内存;
3.实例化并调用init()方法初始化该Servlet;
4.service()(根据请求方法不通调用doGet()或者doPost(),此外还有doHead()\doPut()\doTrace()\doDelete()\doOptions()\destroy());
5.加载和实例化Servlet.这项操作一般是动态执行的.然而,Servlet通常会提供一个管理的选项,用于在Server启动时强制装载和初始化特定的Servlet.
最后,什么是Spring MVC?
Spring MVC又叫Spring Web MVC,是Spring框架的一个模块,用于快速开发Web应用.MVC代码Model-View-Controller,是一个广泛应用于GUI开发的设计模式.该模式不局限于Web开发,也广泛应用在桌面开发技术上.
我在学习的过程中,将一些需要记忆的信息整理了下,以期用到时不用翻书,直接看记录的信息就可以了。每章内容如下:

第1章:Servlets
Servlets,介绍ServletAPI,本章重点关注两个java包:javax.servlet和javax.servlet.http packages.
javax.servlet,其中包含定义Servlet和Servlet容器之间契约的类和接口;
javax.servlet.http,其中包含定义HTTP Servlet和Servlet容器之间契约的类和接口;
javax.servlet.annotation,其中包含标注Servlet\Filter\Listener的标注.它还被标注原件定义元数据;
javax.servlet.descriptor,包含提供程序化登录web应用程序的配置信息的类型.
注:放在应用程序目录下的任何资源,用户只要输入资源URL,都可以直接访问到。如果想让某一个资源可以被Servlet访问,但不可以被用户访问,那么就要把它放在WEB-INF目录下。
javax.servlet.http中的主要类型
HttpServletRequest表示HTTP环境中的Servlet请求.它扩展javax.servlet.ServletRequest接口,并添加了几个方法.新增的部分方法如下:
java.lang.String getContextPath()—返回表示请求上下文的请求URI部分;
cookie[] getCookies()----返回一个Cookie对象数组;
java.lang.String getHeader(java.lang.String name) —返回指定HTTP标题的值
java.lang.String getMethod()----返回生成这个请求的HTTP方法名称;
java.lang.String getQueryString() —返回请求URL中的查询字符串;
HttpSession getSession() 返回与这个请求相关的会话对象.如果没有,将创建一个新的会话对象
HttpSession getSession(boolean create) 返回与这个请求相关的会话对象.如果有,并且create参数为True,将创建一个新的会话对象.
HttpServletResponse标识HTTP环境中的Servlet响应.
void addCookie(Cookie cookie)—给这个响应对象添加一个cookie;
void addHeader(java.lang.String name, java.lang.String value)----给这个对象添加一个header
void sendRedirect(java.lang.String location) -----发送一条响应码,将浏览器跳转到指定的位置.
部署描述符是配置Servlet应用程序的另一种方法,部署描述符总是命名为web.xml,并且放在WEB-INF目录下.
所有的Servlet都运行在Servlet容器中.容器和Servlet间的接口为javax.servlet.Servlet,javax.servlet包还提供了一个名为GenericServlet的Servlet实现类,该类是一个辅助类,以便可以方便的创建一个Servlet.不过,大部分servlet都运行在HTTP环境中,因此派生了javax.servlet.http.HttpServlet的子类,注意HttpServlet也是GenericServlet的子类.

第2章:会话管理
讨论了会话管理-在web应用开发中非常重要的主题(因为HTTP是无状态的),本章比较了4种不同状态的保持技术:URL重写、隐藏域、Cookies和HTTPSession对象;
由于HTTP的无状态性,使得会话管理或会话跟踪称为Web应用开发一个无可避免的主题.默认下,一个web服务器无法区分一个http请求是否为第一次访问.
URL重写适合于tokens无须在太多URL间传递的情况下,然而它有如下限制:

URL重写
URL在某些浏览器上最大长度为2000字符;

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

隐藏域
使用隐藏域来保持状态类似于URL重写技术,但不是将值附加到URL上,而是放到HTML表单的隐藏域中。当表单提交时,隐藏域的值也同时提交到服务器端。隐藏域技术仅当网页有表单时有效。该技术相对于
URL重写的优势在于:没有字符数限制,同时无须额外的编码。但该技术同URL重写一样,不适合跨越多个界面。
Cookies
Cookies是一个很少的信息片段,可自动的在浏览器和web服务器间交互,Cookie作为HTTP header的一部分,其传输由HTTP协议控制.而且可以控制cookies的有效时间.浏览器通常支持每个网站高达20个cookies.Cookies的问题在于用户可以通过改变其浏览器设置来拒绝接受cookies.要使用cookies,需要熟悉javax.servlet.http.Cookie类以及HttpServletRequest和HttpServletResponse两个接口.

Cookie cookie = new Cookie(name, value);

要将cookie发送到浏览器,需要调用HttpServletResponse的add方法:

httpServletResponse.addCookie(cookie);
Cookie[] cookies = request.getCookies();
Cookie maxRecordsCookie = null;
if (cookies != null) {
for (Cookie cookie : cookies) {
if (cookie.getName().equals("maxRecords")) {
maxRecordsCookie = cookie;
break;
}
}
}

目前,还没有类似于getCookieByName这样的方法来帮助简化工作。此外,也没有一个直接的方法来删除一个cookie,你只能创建一个同名的cookie,并将maxAge属性设置为0,并添加到HttpServletResponse接
口中。如下为删除一个名为userName的cookie代码:

Cookie cookie = new Cookie("userName", "");
cookie.setMaxAge(0);
response.addCookie(cookie);

HttpSession对象
在所有的对话跟踪技术中,HttpSession对象是最强大和通用的.一个用户可以有且最多有一个HttpSession,并且不会被其他用户访问到.
不同于URL重新、隐藏域或cookie,放入到HttpSession 的值,是存储在内存中的,因此,不要往HttpSession放入太多对象或大对象。大部分情况下,应该主动销毁无用的HttpSession,以便释放相应的内存.
可以通过调用HttpSession的getMaxInactiveInterval方法来查看会话多久会过期.该方法返回一个数字类型,单位为秒.设置其超时时间
void setMaxInactiveInterval(in

  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值