servlet常见问题

1,servlet是什么 servlet的执行原理是什么?

Servlet是一个用于扩展服务器端功能的服务器端组件技术 运行在服务器端,所以调用执行是由服务器负责 在web.xml中需要进行配置,就是将servlet和一个请求地址建立对应关系,当浏览器对地址 发起请求时,服务器则按照规则调用serlvet类中的方法 服务器端的组件技术 直接或者间接的实现Servlet接口 用于扩展服务器端功能,可以实现动态网页的开发。

2, Tomcat怎么修改端口号

一、找到server.xml文件

进入tomcat安装目录,进入conf文件夹,找到server.xml文件

二、编辑server.xml文件

找到Connector标签,红方框中8080位置就是端口号,修改这个端口号即可,之后重启服务器

3, 除了Tomcat还知道哪些web服务器

Jboss作为Java EE应用服务器,它不但是Servlet容器,而且是EJB容器,从而受到企业级开发人员的欢迎,从而弥补了Tomcat只是一个Servlet容器的缺憾。

 Resin也仅仅是一个Servlet容器,然而由于它优秀的运行速度,使得它在轻量级Java Web领域备受喜爱,特别是在互联网Web服务领域,众多知名公司都采用其作为他们的Java Web应用服务器,譬如163、ku6等。

在商用应用服务器里主要有:Weblogic、Websphere,其中Weblogic我也使用过很长一段时间,当时也只用其当Servlet容器,然而就同等条件下,在性能及易用性等方面,要比Tomcat优秀很多

.glassfish是Sun公司推出的Java EE服务器,一个比较活跃的开源社区,不断的通过社区的反馈来提高其的可用性,经过glassfish v1、glassfish v2 到今天的glassfish v3,它已经走向成熟。Glassfish是一个免费、开放源代码的应用服务,它实现了Java EE 5,Java EE 5 平台包括了以下最新技术:EJB 3.0、JSF 1.2、Servlet 2.5、JSP 2.1、JAX-WS 2.0、JAXB 2.0、 Java Persistence 1.0、Common Annonations 1.0、StAX 1.0等。支持集群,通过内存中会话状态复制,增强了部署体系结构的可用性与可伸缩性,它对集群有着很好的支持,可以简单到通过添加机器,就可轻松的提高网站的带负载能力。在解析能力方面,它对html的吞吐能力与apache服务器不分上下,就是tomcat所不能比的,支持目录部署,热部署,解决了tomcat对热部署能力的缺陷。在版本方面做的更加人性化,有开发时用的简化版,专门用于部署web项目的版本,还要完全符合j2ee标准的版本。

4,常见的http状态码有哪些,分类说明

200 – 请求成功

301 – 资源(网页等)被永久转移到其它URL

404 – 请求的资源(网页等)不存在

500 – 内部服务器错误

5,get和post请求有什么区别,什么情况下调用doGet()和doPost()?

URL地址长度不同, GET支持的字符少

GET的密码是明文,安全问题,容易受到黑客攻击

GET只传输文本,不支持文件传输

GET方式通常用来查询,不用来修改数据,修改数据用POST

Jsp页面中的FORM标签里的method属性为get时调用doGet(),为post时调用doPost()。

在地址栏输入URL回车,会调用doGet()方法。

在jQuery等AJAX框架中,使用$.get时调用doGet(),使用$.post时调用doPost()

6, http的请求数据包和响应数据包中包含哪些内容

请求数据包结构:

  • 请求行:请求行在请求数据包的第一行,包含请求类型(get/post)、请求资源路径、协议的版本和类型

二、消息头:若干消息头样式(w3c定义的一些有特殊意义的键值对),如content-type=text/html,charset=utf-8等,服务器端和客户端都会遵循消息头的约定,也可以通过代码设置。

三、消息正文:如果请求方式为post,请求参数和值就会放在这里,如果为get那么请求参数和值就会包含在资源路径上。

响应数据包:

一、状态行:包含两部分内容的协议的版本和类型,状态码(500表示程序出错,404找不到资源路径,200正常运行)。

二、消息头:同上。

三、响应正文:服务器返回给浏览器的处理结果。

7,请描述一次完整的http请求过程,即前端浏览器输入url之后会经历什么

DNS解析

TCP连接

发送HTTP请求

服务器处理请求并返回HTTP报文

浏览器解析渲染页面

连接结束

8,servlet的生命周期是什么

1. init()方法

在Servlet的生命周期中,仅执行一次init()方法,它是在服务器装入Servlet时执行的,可以配置服务器,以在启动服务器或客户机首次访问Servlet时装入Servlet。无论有多少客户机访问Servlet,都不会重复执行init();

2. service()方法

它是Servlet的核心,每当一个客户请求一个HttpServlet对象,该对象的Service()方法就要调用,而且传递给这个方法一个“请求”(ServletRequest)对象和一个“响应”(ServletResponse)对象作为参数。在HttpServlet中已存在Service()方法。默认的服务功能是调用与HTTP请求的方法相应的do功能。

3. destroy()方法

仅执行一次,在服务器端停止且卸载Servlet时执行该方法,有点类似于C++的delete方法。一个Servlet在运行service()方法时可能会产生其他的线程,因此需要确认在调用destroy()方法时,这些线程已经终止或完成。

(1)加载和实例化:默认情况下,当Servlet第一次被访问时,由容器创建Servlet对象;

(2)初始化:在Servlet实例化之后,容器将调用Servlet的init()方法初始化这个对象,完成一些如加载配置文件、创建连接等初始化的工作,该方法只调用一次;

(3)请求处理:每次请求Servlet时,Servlet容器都会调用Servlet的Servlet()方法对请求进行处理;

(4)服务终止:当需要释放内存或者容器关闭时,容器就会调用Servlet实例的destroy()方法完成资源的释放。在destroy()方法调用之后,容器会释放这个Servlet实例,该实例随后会被Java垃圾收集器所回收。

9, servlet是线程安全的吗?如果不是,应该怎么处理

    首先,默认的servlet是非线程安全的,servlet是单例模式,只产生一个实例,根据项目中web.xml实例,这个实例是web容器产生的,比如Tomcat,JBOSS,weblogic等。

就是说多个客户请求产生多个线程,一个线程对应一个客户,但是用的servlet对象却是一个。既然用的对象是一个,那么实例变量就是共享数据了,说到共享数据还不同步,必然是非线程安全的。

1.使用方法内局部变量

是因为各线程有自己堆栈空间,存储局部变量

方法参数传入,多采用传值(volue copy)传入方法内

2.对操作共享资源的语句,方法,对象, 使用同步

比如写入磁盘文件,采用同步锁,但建议尽量用同步代码块,不要用同步方法

3.使用同步的集合类

使用Vector代替ArrayList

使用Hashtable代替HashMap。

4.不要在 Servlet中再创建自己的线程来完成某个功能。

10, request和response是什么,request中有哪些主要方法 redirect和forward的区别是什么

 request是代表Http请求信息的对象,其中封装了浏览器向服务器发送的请求信息,将request传递给service方法,在处理请求的过程中,可以通过request对象获取请求相关的信息。

  response对象是代表Http响应信息的对象,其中将会封装服务器向浏览器做出的响应信息,将response传递给service方法,在处理请求的过程中,如果有任何数据要发送给浏览器,可以通过response获取流进行发送

1.从地址栏显示来说

forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址.

redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.所以redirect等于客户端向服务器端发出两次request,同时也接受两次response。

2.从数据共享来说

forward:转发页面和转发到的页面可以共享request里面的数据.

假如从a页面 到 b页面 再到c页面 如果用在a页面中:

request.setAttribute(“a”,“aa”);

<jsp:forward page=“b.jsp”></jsp:forward>

在b页面中:

<jsp:forward page=“c.jsp”></jsp:forward>

跳转 在c页面用

request.getAttribute(“a”)

就可以得到a页面的值,或者用

request.getParameter(“name”)也可以得到。

但是要用response.sendRedirect(“b.jsp”);跳转的话就得不到a 页面的值和内容。redirect:不能共享数据.

redirect不仅可以重定向到当前应用程序的其他资源,还可以重定向到同一个站点上的其他应用程序中的资源,

甚至是使用绝对URL重定向到其他站点的资源.

forward,方法只能在同一个Web应用程序内的资源之间转发请求.

forward 是服务器内部的一种操作.

redirect 是服务器通知客户端,让客户端重新发起请求.

所以,你可以说 redirect 是一种间接的请求, 但是你不能说"一个请求是属于forward还是redirect "

3.从运用地方来说

forward:一般用于用户登陆的时候,根据角色转发到相应的模块.

redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等.

4.从效率来说

forward:高.

redirect:低.

5.jsp 语法

<jsp:forward page={“relativeurl” | “<%= expression %>”} />

或者这样写:

<jsp:forward page={“relativeurl” | “<%= expression %>”} >

<jsp:param name=“parametername” value="{parametervalue | <%= expression %>}" />+

</jsp:forward>

11, JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?

1.相同点:JSP是  Servlet技术的扩展,所有的jsp文件都会被翻译为一个继承 HttpServlet的类.也就是jsp最终也是一个Servlet,本质上是Servlet的简易方式,这个 Servlet对外提供服务.

2.Servlet和  JSP最主要的不同点在于  JSP侧重于视图,Servlet主要用于控制逻辑。Servlet如果要实现  html的功能,必须使用  Writer输出对应的html,比较麻烦。而 JSP的情况是 Java和 HTML可以组合成一个扩展名为.jsp的文件,做界面展示比较方便而嵌入逻辑比较复杂.

12,如果浏览器cookie被用户禁止,session还能用吗?

一般情况下,在会话中,服务器存储的session是通过sessionid存储在cookie中,来存储在客户端的。所以,如果浏览器禁用了cookie,客户端请求没办法传递sessionid,服务器无法识别用户身份,会导致session失效。

13,有哪些方法可以完成会话跟踪

从原理上分析,一次请求和响应主要参与的有服务器、客户端,以及通信的HTTP协议,多以分别从这三方面考虑,会话跟踪技术主要有以下四种:

(1)Cookie

(2)url重写

(3)隐藏表单域

(4)Session

14,页面间对象传递的方法

 1,通过servletcontext,也就是application对象了,但这种情况要求在同一个web应用下,

 2. 通过sessioncontext,也就是session对象了,这种情况一般也是要求在同一个web应用下,
   1和2在特定的部署条件下,比如支持对话复制的负载均衡环境下,或者cluster情况下,可以跨服务器

 3. 通过request对象,也就是在request里设置properties了,但是这种情况要求必须使用request.dispatch方法,也就是在server端重定向
 4. 通过response.redirect方法,这样既可以利用sesseion和application,如果不在同一个web应用下,就要使用url编码来传递参数了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 什么是ServletServlet是一种Java编写的服务器程序,运行在支持Java Servlet规范的Web服务器上,用于处理客户端请求并生成响应。 2. Servlet的生命周期是什么? Servlet的生命周期包括:装载、初始化、服务和销毁四个阶段。在装载时,Servlet类被加载到JVM中;在初始化时,Servlet容器创建Servlet实例并调用其init()方法进行初始化;在服务时,Servlet容器调用其service()方法来处理客户端请求;在销毁时,Servlet容器调用其destroy()方法来释放资源。 3. Servlet的线程安全问题如何解决? Servlet是多线程的,因此需要考虑线程安全。常见的解决方案包括使用synchronized关键字、使用线程安全的容器(如ConcurrentHashMap)、使用ThreadLocal等。 4. Servlet如何获取请求参数? Servlet可以通过HttpServletRequest对象的getParameter()方法来获取请求参数。例如: String username = request.getParameter("username"); 5. Servlet如何获取Session对象? Servlet可以通过HttpServletRequest对象的getSession()方法来获取Session对象。例如: HttpSession session = request.getSession(); 6. Servlet如何重定向响应? Servlet可以通过HttpServletResponse对象的sendRedirect()方法来重定向响应。例如: response.sendRedirect("http://www.example.com"); 7. Servlet如何实现文件上传? Servlet可以通过使用Apache Commons FileUpload组件来实现文件上传。具体实现步骤包括:创建Servlet、创建文件上传处理器、解析请求、获取上传文件、保存上传文件。 8. Servlet如何使用过滤器? Servlet可以通过使用过滤器来对请求进行预处理和后处理。具体实现步骤包括:创建过滤器、配置过滤器、编写过滤器代码。 9. Servlet如何使用监听器? Servlet可以通过使用监听器来监听Servlet容器中的事件,如Servlet的生命周期、Session的创建和销毁等。具体实现步骤包括:创建监听器、配置监听器、编写监听器代码。 10. Servlet如何处理异常? Servlet可以通过try-catch语句来处理异常,或者使用Servlet容器提供的异常处理机制。例如,可以通过在web.xml文件中配置error-page元素来指定异常处理页面。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值