Java Web进阶总结

概述

Java Web 的核心底层技术是Jave Servlet (Java 服务器小程序),是一个基于Java技术的Web组件,运行在服务器端,由Servlet容器所管理(Servlet不能独立运行,它必须部署到Servlet容器中,由容器来实例化和调用Servlet的方法),用于生成动态的内容。
Servlet容器有时候也叫做 Servlet引擎。
后期JSP技术推出后,管理和运行Servlet/JSP的容器,也称为Web容器。

支持JSP的服务器很多,Tomcat,Resin,Weblogic,WebSphere等,
Tomcat,Resin 开源免费。Weblogic,WebSphere 重量级服务器,价格昂贵。
关于Tomcat的介绍,可以看下面的博客:

Tomcat详细介绍和使用总结

Servlet

Java EE 规范:即 Servlet开发规范。

如何开发一个被用户进行远程调用的Java类?

  1. Servlet规范中,只有实现Servlet接口的类才可以被用户通过浏览器进行访问;
  2. 根据当前用户使用的请求方式,重写Servlet接口中的doGet/doPost方法(服务方法,相当于main)
  3. 通知Tomcat,告诉它当前网站中存在了可以被用户远程访问的Java类;

继承关系

HttpServlet 的 源码在: javax.servlet-api.3.0.1-source.jar 包中;

[Servlet实现类] extends HttpServlet{
...
}

public abstract class HttpServlet extends GenericServlet{
...
}

public abstract class GenericServlet implements Servlet, ServletConfig, Serializable {
...
}

Servlet的请求路径写法:四种写法

1. 具体请求路径写法

例子:OneServlet.java

<url-pattern>/test/one</url-pattern>

含义:如果当前请求从网络名称后面截取的【请求路径】,与当前请求路径完全一致,说明当前用户请求的是这个Servlet
例子:
http://localhost:8080/myWeb/test/one ok
http://localhost:8080/myWeb/bb/test/one 不予理睬

2. 前置条件请求路径写法

例子:OneServlet.java

<url-pattern>/test/*</url-pattern>

含义:如果当前请求从网站名称后面截取的【请求路径】以“/test/”为开头,表示本次请求是OneServlet; *代表任意字符串,包括没有;
例子:
http://localhost:8080/myWeb/test/meimei.jpg ok
http://localhost:8080/myWeb/bb/test/one 不予理睬
http://localhost:8080/myWeb/test/ ok

3. 后置条件请求路径写法

一定不能以斜线开头,习惯把Servlet资源后缀名默认为.do
例子:OneServlet.java

<url-pattern>*.do</url-pattern>

含义:如果当前请求从网站名称后面截取的【请求路径】,以".do"为结尾,表示本次请求是OneServlet
例子:
http://localhost:8080/myWeb/test/one.do ok
http://localhost:8080/myWeb/test/one.do?name=mike ok

http请求协议包:
【请求行】:
请求地址:http://localhost:8080/myWeb/test/one.do
请求方式:get
【请求头】{name:mike}
【空白行】
【请求体】

4. 通配符请求路径

例子:OneServlet.java

<url-pattern>/*</url-pattern>

含义:对于当前网站任何资源的请求都要交给当前的Servlet
例子:
http://localhost:8080/myWeb/test/one.htm ok
http://localhost:8080/myWeb/bb/test/one.do ok
http://localhost:8080/myWeb ok

四种请求路径执行的优先级

http://localhost:8080/myWeb/test/one.do
具体请求路径 > 前置条件 > 通配符条件 > 后置条件

Servlet中使用工具对象

HttpServletRequest

  1. 我们习惯于将HttpServletRequest类型修饰的对象称为请求对象
  2. 请求对象只能由Tomcat负责创建,并把它作为参数传入到当前Servlet中的服务方法(doGet/doPost)
  3. 通过请求对象可以读取当前请求协议包中的内容

HttpServletResponse

待更新

Tomcat是如何管理Servlet实现类(生命周期)

1. Servlet实现类的实例对象的创建?

在一个Web工程中,所有的【Servlet实现类】都只能由Tomcat负责创建,没有任何一个new xxxServlet()这种写法。

2. Tomcat在何时创建了Servlet实现类的实例对象?

  1. 【默认情况】,只有当第一个用户来访问当前【Servlet实现类】时,Tomcat才会创建Servlet的实例对象
  2. 【人工干预】,指定对应的Servlet实现类在Tomcat启动时被创建: 添加下面的配置
    作用:通知Tomcat在启动时创建该Servlet的实例对象;
    <servlet>
    <load-on-startup>1</load-on-startup>
    </servlet>
    
    # 默认为0,设置的值大于0,就会在启动的时候创建
    # load-on-startup 的值越小,创建的优先级就越高
    

3. 在Tomcat运行期间,如果一个Servlet被多个用户进行访问时,此时Tomcat会为Servelet创建多少个实例对象?

在Tomcat运行期间,一个Servelet实现类只能被创建一个实例对象;

4. Servlet实现类的实例对象何时被销毁?

开发人员没有权利销毁Servlet,在Tomcat关闭之前,由Tomcat负责销毁掉所有的实例对象

Web工程中,Java类文件存放在哪里?

/WEB-INF/classes

get 和 post 请求有哪些区别?

GET在浏览器回退时是无害的,而POST会再次提交请求。
GET产生的URL地址可以被Bookmark,而POST不可以。
GET请求会被浏览器主动cache,而POST不会,除非手动设置。
GET请求只能进行url编码,而POST支持多种编码方式。
GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
GET请求在URL中传送的参数是有长度限制的,而POST么有。
对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
GET参数通过URL传递,POST放在Request body中。

常见问题及解决

1. 中文参数乱码问题

原因

浏览器采用【GET】发送请求,请求参数保存在【请求头】,【请求头】中的内容是由Tomcat来负责组装,Tomcat 9.0默认使用的字符集utf-8;
浏览器采用【POST】发送请求,请求参数保存在【请求体】,【请求体】内容是由请求对象负责组装的。请求对象默认使用 ISO-8859-1(欧洲语境的内容)

解决方案

针对【post】方式:在request进行装箱操作之前,为其指定正确的字符集: 用下面的代码

request.setCharacterEncoding("utf-8")
request.getParameter("参数名")

老版本Tomcat,【get】方式,通知Tomcat使用正确的字符集
修改Tomcat/conf/server.xml,增加一个下面的属性:

<Connector connectionTimeout="20000" port="8080" 
protocol="HTTP/1.1" redirectPort="8443" URIEncoding="utf-8"/>

JSP

JSP:Java Server Page的简写

JSP 和 Servlet 有什么区别?

  1. JSP经编译后就变成了Servlet.(JSP的本质就是Servlet,JVM只能识别java的类,不能识别JSP的代码,Web容器将JSP的代码编译成JVM能够识别的java类)
  2. JSP更擅长表现于页面显示,servlet更擅长于逻辑控制。
  3. Servlet中没有内置对象,Jsp中的内置对象都是必须通过HttpServletRequest对象,HttpServletResponse对象以及HttpServlet对象得到。
  4. JSP是Servlet的一种简化,使用Jsp只需要完成程序员需要输出到客户端的内容,Jsp中的Java脚本如何镶嵌到一个类中,由Jsp容器完成。而Servlet则是个完整的Java类,这个类的Service方法用于生成对客户端的响应。

JSP内置对象及其作用

JSP有9个内置对象:

内置对象作用
request封装客户端的请求,其中包含来自GET或POST请求的参数;
response封装服务器对客户端的响应;
pageContext通过该对象可以获取其他对象;
session封装用户会话的对象;
application封装服务器运行环境的对象;
out输出服务器响应的输出流对象;
configWeb应用的配置对象;
pageJSP页面本身(相当于Java程序中的this);
exception封装页面抛出异常的对象。

JSP 的 4 种作用域

JSP中的四种作用域包括page、request、session和application,具体来说:

  1. page代表与一个页面相关的对象和属性。
  2. request代表与Web客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个Web组件;需要在页面显示的临时数据可以置于此作用域。
  3. session代表与某个用户与服务器建立的一次会话相关的对象和属性。跟某个用户相关的数据应该放在用户自己的session中。
  4. application代表与整个Web应用程序相关的对象和属性,它实质上是跨越整个Web应用程序,包括多个页面、请求和会话的一个全局作用域。

jsp对应的java文件和编译出来的类文件位置

<tomcat base>\work\Catalina\localhost\…\jsp

forward 和 redirect 的区别?

Forward和Redirect代表了两种请求转发方式:直接转发和间接转发。

  1. 直接转发方式(Forward),客户端和浏览器只发出一次请求,Servlet、HTML、JSP或其它信息资源,由第二个信息资源响应该请求,在请求对象request中,保存的对象对于每个信息资源是共享的。
  2. 间接转发方式(Redirect)实际是两次HTTP请求,服务器端在响应第一次请求的时候,让浏览器再向另外一个URL发出请求,从而达到转发的目的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值