web的request的作用域,求各位看看
刚学web几天不是很理解request的生命周期
今天在学校做了个验证码的的验证的例子
1)有一个生成验证码的servlet,这个验证码为4个字母组成,在这个servlet中用request.getSession().setAttribute();这个方法记录了这个4个生成的字母 好在后面做比较
2)一个JSP页面 这个页面有一个img元素用来显示图片 这个img元素的src调用生成验证码的servlet 还有一个文本框用来输入字母跟验证码做比较
3)还有一个servlet用来检测用户在文本框上输入的字母是不是和验证码上的相同,这个servlet中用了request.getSession().getAttribute()来得到刚才封装在session中的字母 用来做比较
大概流程是 访问jsp页面 然后验证的时候访问验证的servlet也就是上面的第3)步
但为什么我把1)中的的字母封装在request中 也就是request.setAttributr()中 然后在3)中用request.getAttribute()得到封装在request中的字母
然后我运行程序 为什么报了ullPointerException这个异常
还有就是当一次请求结束之后 还能用request.getAttribute()这个方法得到封装在request中的数据吗?
刚学 很模糊 还请各位 给我讲讲 谢谢了
------解决方案--------------------request的生命周期就一个请求,当请求结束后就销毁了,再次请求时是创建新的request对象,当你把验证码绑定到request对象,再次请求,request销毁了,绑定的数据自然没了
而session的只要没有超时或者失效就会一直存在,在第一次请求是,把验证码数字绑定到session中,再次请求,还是这个session对象,里面的验证码还在,可以取出与用于输入的验证码比较结果.
------解决方案--------------------
你jsp基础太差了,新手吧。
page:用户请求的当前页面,即在同一个页面中有效,一个jsp页面。
request:用户请求访问的当前组件、以及和当前web组件共享同一用户请求的web组件。如:被请求的jsp页面和该页面用<include>指令包含的页面以及<forward>标记包含的其他jsp页面。范围是指在一个jsp网页发出请求到另一个jsp网页之间,随后这个属性就失效,设定request的范围时可利用request对象中的setattribute()和getattribute(),简单的讲就是客户端的一次请求。
session:同一个http会话中的web组件共享它,范围为一段用户持续和服务器所连接的时间,但与服务器断线,这个属性就无效,只要将数据存入session对象,数据的范围就是session.
application:整个web应用的所有web组件共享它。