jsp代码项目例子_带你深入理解Servlet和JSP

Servlet是运行在Web服务器上的程序,它担当Web浏览器或其它http客户端发出的请求,与http服务器上的数据库或应用程序之间的中间层.它们的工作是执行如下所示的任务:

cd9d666a00c75d6b0df27c95024d7556.png
  1. 读取客户程序发送的显式数据
  2. 读取浏览器发出的隐式http请求数据
  3. 生成结果
  4. 向客户发送显式数据(即文档)
  5. 发送隐式的http响应数据

这5个工作步骤看起来比较抽象,我们举个具体的例子来说明.

我们知道一个Servlet可以对应处理某个链接请求,当我们用浏览器请求某个链接时(以GET请求为例),浏览器实际上会发送这些东西到Web服务器:

GET /lifecycle/welcome?username=liangyudong HTTP/1.1
Host: localhost:8082
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36
Sec-Fetch-User: ?1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: Hm_lvt_82116c626a8d504a5c0675073362ef6f=1585269393,1585357421,1586488037,1586738782

这就是一个标准的http请求的格式.

假设Web服务器是你编写的,那么你的服务器为了处理这个请求,是不是要解析这段http请求内容,这个http请求的method是什么,协议是什么,都有哪些请求参数,有哪些头字段,有哪些cookie等等.当你解析完这些内容时,是不是要提供一个标准的方式让人可以访问拿到这些信息.

当我们想明白这些,就可以清楚知道Servlet是什么了,它其实就是一些Java接口,定义了操纵这些数据的规范.所有的Java Web服务器开发商都遵循这个规范来开发Web服务器,这样我们就可以用统一的规范来编程了.

我们先来编写一个简单的Servlet,可以看到HttpServletRequest对象就代表了http请求内容,这其实就是一个接口,定义了访问http请求内容的规范.

具体的解析http请求内容的工作由Web服务器完成,然后暴露HttpServletRequest对象给我们,这样我们就可以做自己的事情了.

HttpServletResponse对象则代表了http响应内容,这其实也是个接口,定义了生成http响应内容的规范.当然,具体的实现细节也是Web服务器完成的.

public 

请求这个Servlet的http响应内容是这样的,可以看到这就是一个标准的http响应的格式,Web服务器添加了隐式的http响应数据,而动态的html网页内容则是由我们在Servlet里生成:

HTTP/1.1 200 
Content-Type: text/html;charset=ISO-8859-1
Content-Length: 155
Date: Sat, 09 May 2020 07:29:56 GMT
Keep-Alive: timeout=20
Connection: keep-alive

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>welcome</title>
</head>
<body>
<h1>liangyudong welcome!</h1>
</body>
</html>

用浏览器请求的的展示效果是这样的:

5c73e3d28e6f3e2701ca5913cd5c89eb.png

通过这个例子,是不是能很好理解Servlet的5个工作步骤了.

那么JSP又是什么呢?

通过前面的例子,我们可以看到html网页内容需要我们在Servlet里去一个标签一个标签去生成,如果一个页面超级复杂,特别是现在html页面动不动几千行代码,那这个Servlet的代码就会十分庞大臃肿,可读性可维护性都非常差.

这时候怎么办呢?sun公司很早就意识到了这个问题,便倡导很多公司一块来创建了一种能够动态生成html的新技术,于是JSP便应运而生,有效的解决了上面Servlet所出现的问题.

上述例子的JSP版本:

Servlet代码,业务逻辑均在此处理(HelloJspServlet.java):

public 

JSP代码,页面展示(welcome.jsp):

<%@ page contentType="text/html" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>welcome</title>
</head>
<body>
<h1>${requestScope.username} welcome!</h1>
</body>
</html>

该JSP页面会先被翻译成Servlet文件(翻译工作由Web服务器完成),然后在被编译成class文件.我们可以可以看看翻译后的Servlet文件是怎样的(welcome_jsp.java):

public 

所以说JSP只是Servlet的一种特殊形式,每一个JSP页面就是一个Servlet实例,通俗一点的话来说:JSP就是Servlet,只不过Servlet把一些业务功能剥离开来交给了或者是形成了JSP.总的来说:Servlet侧重于业务处理,而JSP侧重于页面展示.

关于Servlet和JSP的介绍就到这里.另外我关注到有很多人有这样的观点:认为Servlet和JSP过时了,所以可以不用学了,这个观点我非常不赞同.目前来说Servlet编程仍然是Java Web编程的核心,不管是springMVC框架,还是struts框架,其底层用的还是Servlet,因此掌握Servlet仍然是Java程序员的必备技能之一.

而对于JSP,其作为曾经一度火爆的技术,目前还是有大量的公司遗留项目的表现层技术用的是JSP,而这些遗留项目还是在继续维护中的,我们在公司里不可避免的需要维护和更新这些项目,所以JSP还是需要理解的,但不需钻研太深.

现在的主流开发趋势是前后端分离.前后端分离其实就是后端工程师只关注于后端业务逻辑的开发,不再处理前端问题.前端工程师只关注于自己的页面开发.当需要数据交互的时候,两者会有一份接口文档.这种趋势的流行真正让JSP走向没落.

最后想深入学习Servlet的,推荐此书:

<<Servlet与JSP核心编程>> 美Marty Hall, Larry Brown著

源码github地址:

https://github.com/jufeng98/java-master​github.com
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
顺序如下: 1、多种字体大小显示 2、c:out标记输出 3、获取当前时间 4、include包含语句 5、建立错误处理页面的范例程序 6、jsp:forward 7、简单计数器 8、设置页面属性 9、使用GB2312编码 10、使用Big5编码 11、c:catch的用法 12、 begin、end和step的用法 13 、 循环 14、 varStatus 的四种属性 15、 的用法 16、从客户端传送数据至服务端 17、使用Unicode转义字符 18、使用朝鲜语字符集 19、JSP中最简单的国际化程序 20、错误检测 21、抛出异常 22、 的用法 23、和 的用法 24、 的用法 25、jsp-include的用法 26、汉字处理 27、网页重定向 28、自动更新网页 29、存取session 30、 的用法 31、单选型列表框 32、jsp文件中定义类 33、取得 JSP Container 版本 34、javax.servlet.jsp.JspWriter - out 对象 35、page 隐含对象 36、application 对象 37、PageContext 对象 38、Page范围 - pageContext 39、测试要显示的中文 40、IF控制符的操作 41、HttpServletRequest 接口所提供的方法 42、 网上测验 43、HttpSession - session 对象 44、 多选型列表框 45、解决浏览器 cache 的问题 46、使用 EL、JSTL 处理表单数据 47、 EL隐含对象 param、paramValues 48、EL隐含对象 pageContext 49、EL算术运算符 50、EL关系运算符 51、EL的运算符 52、选择钮的使用 53、检查框的使用 54、群组检查框的使用 55、数字、货币、百分数格式化 56、日期格式化 57、JSTL设置语言地区 58、Cookie数据的存取 59、session有效时间的设置与取得 60、session时间与ID 61、Cookie有效时间的设置 62、利用隐藏字段传送数据 63、JSP 使用 JavaBean 的方法 64、JSP 使用 JavaBean 65、范围为 Page 的 JavaBean范例程序 66、范围为 Request的 JavaBean 67、范围为 Session 的 JavaBean 68、范围为 Application 的 JavaBean 69、删除 JavaBean 70、url重组 71、Switch语句 72、环境变量 73、forward重定向 74、文件的建立与删除 75、取得文件属性 76、取得目录中的文件 77、目录的建立与删除 78、自Cookie存取日期/时间数据 79、管理Session变量 80、数据库中的记录数与记录指针位置 81、利用absolute方法设置记录位置 82、使用jsp指令生成Word文档 83、JSP网页模板 84、判断是否空白文件 85、cookie 用户登录次数 86、获取用户的真实IP地址 87、获取用户的浏览器信息 88、在客户端进行数据检查 89、在JSP中获取当前绝对路径 90、读取表单中所有参数 91、分行写入数据 92、显示请求URL 93、判断session是否过期 94、参数式查询数据库 95、取得数据库中各栏名称 96、使用JavaBean、设置和获取Bean的属性 97、设置Bean的一个属性与输入参数关联 98、实现基于数据库的站内搜索 99、DOM读取XML文档 100、SAX读取XML文档
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值