标签:结束 大量 四种 set 设置 app 浏览器 问题 一个
答:JSP共有以下9种基本内置组件(可与ASP的6种内部组件相对应):
request | 用户端请求,此请求会包含来自GET/POST请求的参数 |
response | 网页传回服务器端的回应 |
pageContext | 网页的属性是在这里管理 |
session | 与请求有关的会话期 |
application | 服务器启动时创建,服务器关闭时停止,为多个应用程序保存信息 |
out | 用来传送回应的输出 |
config | servlet的构架部件 |
page | JSP网页本身 |
exception | 针对错误网页,未捕捉的例外 |
答:JSP共有以下6种基本动作
jsp:useBean | 寻找或者实例化一个JavaBean |
jsp:setProperty | 设置JavaBean的属性 |
jsp:getProperty | 输出某个JavaBean的属性 |
jsp:forward | 把请求转到一个新的页面 |
jsp:plugin | 根据浏览器类型为Java插件生成OBJECT或EMBED标记 |
jsp:include | 在页面被请求的时候引入一个文件 |
答:动态include用jsp:include动作实现 ,它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数 。
静态include用include伪码实现,定不会检查所含文件的变化,适用于包含静态页面。
Servlet生命周期包括三部分:
初始化:Web容器加载servlet,调用init()方法 。
处理请求:当请求到达时,运行其service()方法。service()自动派遣运行与请求相对应的doXXX(doGet或者doPost)方法。
销毁:服务结束,web容器会调用servlet的distroy()方法销毁servlet。
(1)get一般用于从服务器上获取数据,post一般用于向服务器传送数据
(2)请求的时候参数的位置有区别,get的参数是拼接在url后面,用户在浏览器地址栏可以看到。post是放在http包的包体中。
比如说用户注册,你不能把用户提交的注册信息用get的方式吧,那不是说把用户的注册信息都显示在Url上了吗,是不安全的。
(3)能提交的数据有区别,get方式能提交的数据只能是文本,且大小不超过1024个字节,而post不仅可以提交文本还有二进制文件。 所以说想上传文件的话,那我们就需要使用post请求方式 。
(4)servlet在处理请求的时候分别对应使用doGet和doPost方式进行处理请求
Servlet是服务器端的程序,动态生成html页面发送到客户端,但是这样程序里会有很多out.println(),Java与html语言混在一起很乱,所以后来sun公司推出了JSP.其实JSP就是Servlet,每次运行的时候JSP都首先被编译成servlet文件,然后再被编译成.class文件运行。有了jsp,在MVC项目中servlet不再负责动态生成页面,转而去负责控制程序逻辑的作用,控制jsp与javabean之间的流转。
HttpServletRequest:封装了与请求相关的信息
HttpServletResponse:封装了与响应相关的信息
(1)有setAttribute,没有setParameter方法 。
(2)getParameter获取到的值只能是字符串,不可以是对象,而getAttribute获取到的值是Object类型的。
(3)通过form表单或者url来向另一个页面或者servlet传递参数的时候需要用getParameter获取值;getAttribute只能获取setAttribute的值 。
(4)setAttribute是应用服务器把这个对象放到该页面所对应的一块内存当中,当你的页面服务器重定向到另一个页面的时候,应用服务器 。会把这块内存拷贝到另一个页面对应的内存当中。通过getAttribute可以取得你存下的值,当然这种方法可以用来传对象。 用session也是一样的道理,这是说request和session的生命周期不一样而已。
会话作用域ServletsJSP 页面描述 :
转发与重定向 :
(1)从地址栏显示来说
forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址.redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL。
(2)从数据共享来说
forward:转发页面和转发到的页面可以共享request里面的数据.
redirect:不能共享数据.
(3)从运用地方来说
forward:一般用于用户登陆的时候,根据角色转发到相应的模块.
redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等.
(4)从效率来说
forward:高.
redirect:低.
实例变量不正确的使用是造成Servlet线程不安全的主要原因。
从Servlet的调用过程可以看出,当客户端第一次请求Servlet的时候,tomcat会根据web.xml配置文件实例化servlet 。
当又有一个客户端访问该servlet的时候,不会再实例化该servlet,也就是多个线程在使用这个实例。
JSP/Servlet容器默认是采用单实例多线程(这是造成线程安全的主因)方式处理多个请求的,这种默认以多线程方式执行的设计可大大降低对系统的资源需求,提高系统的并发量及响应时间。
Servlet本身是无状态的,一个无状态的Servlet是绝对线程安全的,无状态对象设计也是解决线程安全问题的一种有效手段。
所以,servlet是否线程安全是由它的实现来决定的,如果它内部的属性或方法会被多个线程改变,它就是线程不安全的,反之,就是线程安全的。
1.避免使用实例变量
避免使用非线程安全的集合,在多个Servlet中对某个外部对象(例如文件)的修改是务必加锁(Synchronized,或者ReentrantLock),互斥访问。 属性的线程安全:ServletContext、HttpSession是线程安全的;ServletRequest是非线程安全的。
设计线程安全的Servlet
1.实现 SingleThreadModel 接口
该接口指定了系统如何处理对同一个Servlet的调用。如果一个Servlet被这个接口指定,那么在这个Servlet中的service方法将不会有两个线程被同时执行,当然也就不存在线程安全的问题。但是,如果一个Servlet实现了SingleThreadModel接口,Servlet引擎将为每个新的请求创建一个单独的Servlet实例,这将引起大量的系统开销,在现在的Servlet开发中基本看不到SingleThreadModel的使用,这种方式了解即可,尽量避免使用。
2.同步对共享数据的操作
使用synchronized 关键字能保证一次只有一个线程可以访问被保护的区段,可以通过同步块操作来保证Servlet的线程安全。如果在程序中使用同步来保护要使用的共享的数据,也会使系统的性能大大下降。这是因为被同步的代码块在同一时刻只能有一个线程执行它,使得其同时处理客户请求的吞吐量降低,而且很多客户处于阻塞状态。另外为保证主存内容和线程的工作内存中的数据的一致性,要频繁地刷新缓存,这也会大大地影响系统的性能。所以在实际的开发中也应避免或最小化Servlet 中的同步代码。
3.避免使用实例变量
线程安全问题很大部分是由实例变量造成的,只要在Servlet里面的任何方法里面都不使用实例变量,那么该Servlet就是线程安全的。在Servlet中避免使用实例变量是保证Servlet线程安全的最佳选择。Java 内存模型中,方法中的临时变量是在栈上分配空间,而且每个线程都有自己私有的栈空间,所以它们不会影响线程的安全。
标签:结束 大量 四种 set 设置 app 浏览器 问题 一个
原文地址:https://www.cnblogs.com/whx20100101/p/9862225.html