java中JSP和Servlet的区别?

java中JSP和Servlet的区别?,第1张

Servlet如何处理多个请求访问?
Servlet容器默认是采用单实例线程的方式处理多个请求的:
1当web服务器启动的时候(或客户端发送请求到服务器时),Servlet就被加载并实例化(只存在一个Servlet实例);
2容器初始化化Servlet主要就是读取配置文件(例如tomcat,可以通过servletxml的<Connector>设置线程池中线程数目,初始化线程池通过webxml,初始化每个参数值等等。
3当请求到达时,Servlet容器通过调度线程(Dispatchaer Thread) 调度它管理下线程池中等待执行的线程(Worker Thread)给请求者;
4线程执行Servlet的service方法;
5请求结束,放回线程池,等待被调用;
(注意:避免使用实例变量(成员变量),因为如果存在成员变量,可能发生多线程同时访问该资源时,都来 *** 作它,照成数据的不一致,因此产生线程安全问题)
从上面可以看出:
第一:Servlet单实例,减少了产生servlet的开销;
第二:通过线程池来响应多个请求,提高了请求的响应时间;
第三:Servlet容器并不关心到达的Servlet请求访问的是否是同一个Servlet还是另一个Servlet,直接分配给它一个新的线程;如果是同一个Servlet的多个请求,那么Servlet的service方法将在多线程中并发的执行;
第四:每一个请求由ServletRequest对象来接受请求,由ServletResponse对象来响应该请求。
Servlet容器如何同时来处理多个请求
Java的内存模型JMM(Java Memory Model) ,JMM主要是为了规定了线程和内存之间的一些关系。根据JMM的设计,系统存在一个主内存(Main Memory),Java中所有实例变量都储存在主存中,对于所有线程都是共享的。每条线程都有自己的工作内存(Working Memory),工作内存由缓存和堆栈两部分组成,缓存中保存的是主存中变量的拷贝,缓存可能并不总和主存同步,也就是缓存中变量的修改可能没有立刻写到主存中;堆栈中保存的是线程的局部变量,线程之间无法相互直接访问堆栈中的变量。
Servlet采用多线程来处理多个请求同时访问。servlet依赖于一个线程池来服务请求。线程池实际上是一系列的工作者线程集合。Servlet使用一个调度线程来管理工作者线程。
当容器收到一个Servlet请求,调度线程从线程池中选出一个工作者线程,将请求传递给该工作者线程,然后由该线程来执行Servlet的service方法。当这个线程正在执行的时候,容器收到另外一个请求,调度线程同样从线程池中选出另一个工作者线程来服务新的请求,容器并不关心这个请求是否访问的是同一个Servlet当容器同时收到对同一个Servlet的多个请求的时候,那么这个Servlet的service()方法将在多线程中并发执行。
Servlet容器默认采用单实例多线程的方式来处理请求,这样减少产生Servlet实例的开销,提升了对请求的响应时间,对于Tomcat可以在serverxml中通过<Connector>元素设置线程池中线程的数目。
注意:服务器可以使用多个实例来处理请求,代替单个实例的请求排队带来的效益问题。服务器创建一个Servlet类的多个Servlet实例组成的实例池,对于每个请求分配Servlet实例进行响应处理,之后放回到实例池中等待下此请求。这样就造成并发访问的问题。
此时,局部变量(字段)也是安全的,但对于全局变量和共享数据是不安全的,需要进行同步处理。而对于这样多实例的情况SingleThreadModel接口并不能解决并发访问问题。 SingleThreadModel接口在servlet规范中已经被废弃了

你可以先去绘学霸网站找“游戏设计/游戏制作”板块的免费视频教程-点击进入完整入门到精通视频教程列表: >

一、servlet的配置

servlet有两种配置的方法
1在webxml文件中配置

<servlet>
<servlet-name>loginServlet</servlet-name>
<servlet-class>comhwuaservletLoginServlet</servlet-class></servlet><servlet-mapping>
<servlet-name>loginServlet</servlet-name>
<url-pattern>/login</url-pattern></servlet-mapping>

2在servlet中用Java注解的方式配置
使用注解配置Servlet的步骤:

1 在Servlet类上贴@WebServlet注解2 在webxml文件中进行如下的配置
metadata-complete="true":表示是否忽略Servlet上面的注解
metadata-complete="false"表示是否不忽略Servlet上面的注解,缺省值

二、servlet生命周期

public void init(ServletConfig config):初始化方法,在第一次请求时调用,只在最初的时候调用一次

public void service(ServletRequest req, ServletResponse res):服务方法

public void destroy():销毁方法

三、在webxml文件中设置/获取初始化参数

1作用域当前的servlet 写在servlet标签中

<init-param>
   <param-name>name</param-name>
   <param-value>admin</param-value></init-param>

过去参数 在init方法中

String name = configgetInitParameter("name");

2上下文参数 写在web-app标签中

<context-param>
   <param-name>driver</param-name>
   <param-value>oraclejdbcOracleDriver</param-value></context-param>

获取参数 在init方法中

   ServletContext servletContext = configgetServletContext();
   String initParameter = servletContextgetInitParameter("driver");

四、设置servlet启动的时间

默认情况下servlet是在第一次被请求时启动的
通过在webxml文件中设置

<load-on-startup>1</load-on-startup>

注意:

load-on-startup 的参数是大于等于0的 负数没有效果load-on-startup 必须在参数init-param标签的下面 否则init-param会失效

五、常用方法:

  String getContextPath():获取上下文路径,<Context path="上下文" />
  String getHeader(String headName):根据指定的请求头获取对应的请求头的值   String getRequestURI():返回当期请求的资源名称  上下文路径/资源名
  StringBuffer getRequestURL():返回浏览器地址栏的内容   String getRemoteAddr():返回请求服务器的客户端的IP

六、获取请求参数的方法:

String getParameter(String name):根据参数名称,获取对应参数的值String[] getParameterValues(String name):根据参数名称,获取该参数的多个值
Enumeration<String> getParameterNames():获取所有请求参数的名字Map<String,String[]> getParameterMap():返回请求参数组成的Map集合
   key:参数名称
   value:参数值,封装在String数组中

sevlet能直接运行,需要环境支持的。

不同的web服务器都是servlet容器,这些服务器通常都有一些配置文件、jar、启停脚本等等。需要把Web应用打成WAR包部署到Tomcat中,在Web应用中要指明URL被哪个类的哪个方法所处理(不论是原始的Servlet开发,还是流行的Spring MVC都必须指明)。

服务器将对应的Servlet(比如HelloServlet)实例化,调用Servlet实例的service方法。服务器会将request和response作为参数传递给service方法,可以通过request对象获取请求数据(比如一些请求参数值),通过response对象写入处理结果。

sevlet运行:

服务器通过response对象获取处理结果,创建响应数据包,服务器发送响应数据包给浏览器。浏览器解析响应数据包,并且生成相应的页面。传递给这个方法一个“请求”(ServletRequest)对象和一个“响应”(ServletResponse)对象作为参数。

在>

LGame是框架的一部分,也是针对Java2D游戏开发而设计的“一揽子”项目,它的创立初衷在于构建一个高效且完善的Java2D游戏开发体系。关于LGame的简要介绍:

LGame代码高度向下兼容,jre14及以上版本皆可以正常运行。

LGame是一个高通用性的游戏框架,作为支持Java桌面游戏以及网页游戏开发的全功能引擎,LGame无论对画面绘制、精灵碰撞、特效渲染、窗体组件,还是XML *** 作,文本数据库 *** 作,>

LGame内置有视频解码器,支持mp4视频文件播放(在LGame-Simple-030中将支持flv,在06-07版本中将以可选组件方式引入jmc支持,以争取可播放视频种类的最大化),内置音频解码器支持mid、mod、mp3、ogg、wav、au、aiff、aac、rmf等音频播放,以上解码器皆不依赖于本地资源,只要拥有jre14或以上环境即可正常运行。

就目前阶段而言,LGame图形渲染依赖于Java2D,这虽然保证了LGame可以运行于所有获得JRE支持的桌面系统与浏览器,但在处理复杂图形时效果始终不算理想。因此,后续版本将对此进行改进,预计将于03-04版中提供jogl与lwjgl支持(即opengl支持),将于04-05版中对现有Graphics2D对象进行特殊强化,争取最大程度上解决Java桌面应用的效率问题。

应该说,LGame并不是开发某种特定游戏类型时采用的游戏引擎,而是一个游戏开发框架,一个Java的桌面游戏开发解决方案。因此,所有你能想到的2D游戏类型,都可以采用LGame进行开发。

理论上讲,只要您能够熟练 *** 作LGame,世界上根本没有任何一款2D游戏是您所无法快速实现的。

PS:目前LGame尚未推出正式版本,LGame-Simple版为前瞻性测试及吸收反馈意见使用,此时LGame框架的基本架构尚未最终确定,因此无法保证不同版本间的兼容性。LGame-Simple以每版05的方式跳跃式升级,当LGame-Simple更新到10版本时,既推出LGame-01正式版本,LGame正式版推出后将始终保持新版与旧版间的兼容性。

SpringFrameworkJava开源J2EE框架

Spring是一个解决了许多在J2EE开发中常见的问题的强大框架。Spring提供了管理业务对象的一致方法并且鼓励了注入对接口编程而不是对类编程的良好习惯。Spring的架构基础是基于使用JavaBean属性的InversionofControl容器。然而,这仅仅是完整图景中的一部分:Spring在使用IoC容器作为构建完关注所有架构层的完整解决方案方面是独一无二的。Spring提供了唯一的数据访问抽象,包括简单和有效率的JDBC框架,极大的改进了效率并且减少了可能的错误。Spring的数据访问架构还集成了Hibernate和其他O/Rmapping解决方案。Spring还提供了唯一的事务管理抽象,它能够在各种底层事务管理技术,例如JTA或者JDBC事务提供一个一致的编程模型。Spring提供了一个用标准Java语言编写的AOP框架,它给POJOs提供了声明式的事务管理和其他企业事务--如果你需要--还能实现你自己的aspects。这个框架足够强大,使得应用程序能够抛开EJB的复杂性,同时享受着和传统EJB相关的关键服务。Spring还提供了可以和IoC容器集成的强大而灵活的MVCWeb框架。SpringIDE:Eclipse平台下一个辅助开发插件

StrutsJava开源Web框架

Struts是一个基于SunJ2EE平台的MVC框架,主要是采用Servlet和JSP技术来实现的。由于Struts能充分满足应用开发的需求,简单易用,敏捷迅速,在过去的一年中颇受关注。Struts把Servlet、JSP、自定义标签和信息资源(messageresources)整合到一个统一的框架中,开发人员利用其进行开发时不用再自己编码实现全套MVC模式,极大的节省了时间,所以说Struts是一个非常不错的应用框架。StrutsIDE:用于Struts辅助开发的一个Eclipse插件

HibernateJava开源持久层框架

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来 *** 纵数据库。Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序实用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。Eclipse平台下的Hibernate辅助开发工具:Hibernate


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/13475941.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-08-14
下一篇 2023-08-14

发表评论

登录后才能评论

评论列表(0条)

保存