Servlet最主要的作用就是处理客户端的请求,并向客户端作出响应。
URI:统一资源标志符
URL:统一资源定位符,具体的URI,是URI的一个子集,不仅唯一标识资源,而且还提供了定位该资源的信息。
request对象的学习:
作用:获得request对象中封存了当前请求的所有信息
使用:
获取请求头数据
req.
getMethod();//获取请求方式
req.getRequestURL();//获取请求URL信息
req.getRequestURI();//获取请求URL信息
req.getScheme();//获取协议版本
获取请求行数据:
req.getHeader("键名");//返回指定的请求头信息
req.getHeaderNames();//返回请求头得键名枚举集合
获取用户数据:
req.getParameter("键名");//返回指定的用户健名对应的值,如果没有这个键,不会报错,只会返回null值。
req.getParameterValues("键名");//返回指定的键名对应的多个值,例如返回多选的多个值,如果利用上面的方法,那么只会返回第一个值
req.getParameterNames();//返回所有用户请求数据的键的枚举集合
我是一条没有感情的分割线
response对象的学习:
作用:用来响应数据到浏览器的一个对象
使用:
设置响应头:
resp.setHeader(String name,String value);//在响应头中增加响应信息,如果键名相同,会覆盖之前的信息
resp.addHeader(String name,String value);//在响应头中增加响应信息,不会覆盖之前的信息
设置响应状态:
resp.sendError(int code,String name);//自定义错误状态,前面是状态码,后面是状态码的说明
设置响应实体:
resp.getWriter().write(Strin str);//响应具体的数据给浏览器
我是一条没有感情的分割线
请求、响应乱码问题进行总结及解决:
1.使用String 进行重新编码
键名=new String(键名.getBytes(“iso8859-1”,“utf-8”);
//重要的数据用这个转一下,因为浏览器的版本各不相同,有可能会出现一些奇奇怪怪的问题来着
设置请求编码格式
对于GET方式请求:
步骤1:
req.setCharacterEncoding("utf-8");
步骤2:
在tomcat的目录下的conf目录中修改server.xml文件;在connector标签中增加属性
useBodyEncodingForURI=“true”
对于POST方式请求:
req.setCharacterEncoding("utf-8");
解决post与get方式请求编码问题的唯一区别的就是不需要步骤2。
设置响应编码格式:
resp.setContentType("text/html;charset=utf-8");
servlet使用路程进行总结:
1.浏览器发起请求到服务器(请求)
2.服务器接收浏览器的请求,进行解析,创建request对象存储请求数据
3.服务器调用对应的servlet进行请求处理,并将request对象作为实参,传递给servlet的方法(service方法,dopost方法,doget方法)
servlet方法的使用流程:
1.设置请求编码格式
2.设置响应编码格式
3.获取请求信息
4.处理请求信息
创建业务层对象
调用业务层对象的方法
5.响应处理结果
数据流转流程:
浏览器- - - >服务器- - ->数据库
数据库- - - >服务器- - - >浏览器
request对象的作用域:
使用请求转发后,不同的servlet之间怎么进行数据的共享呢?或者说,数据怎么从一个servlet流转个另外一个servlet呢?
解决:使用request对象的作用域
使用:
req.setAttribute(Object name,Object value);
传递属性,前面是键名,后面是值
注意:如果该对象已经存在该指定键名的值了,setAttribute()会覆盖原来的值,如果传进去的键名的值为null,则会删除指定键名的值,此时效果相当于removeAttribute()方法。
获得对应的键名的值
删除对象的键名的值
req.getAttribute(Object obj);
req.removeAtttibute(Object obj);
作用:解决了一次请求内的不同servlet的数据共享问题
(数据:指的是请求数据和前面的servlet的处理结果)
特点:
1.服务器创建
2.每次请求都会创建
3.生命周期只有一次请求
请求转发
请求转发:服务器在接收到浏览器的请求后,仅仅使用一个servlet进行请求处理,会造成不同的servlet逻辑代码冗余,servlet的职责不明确,所以就用到请求转发·。
使用:req.getRequsetDisapatcher(“要转发的地址”).forward(req,resp);
要转发的地址:相对路径,直接书写servlet里面的别名即可,就在web.xml里面的那个别名,把别名前面的"/"去了即可,学到了以后,还可以写jsp。
注意:在写完请求转发后直接return结束即可。
请求包含
使用include()方法,将servlet请求转发给其他的Web资源进行处理,与请求转发不同的是,在请求返回的响应消息中,既包含了当前servlet的响应消息,也包含了与其他响应信息。
请求重定向
问题:如果当前的请求,servlet无法进行处理怎么办?
如果使用请求转发,造成的表单数据重复提交怎么办?
解决:使用请求重定向
使用:
response.sendRedirect(“路径”);
路径: /包名/servlet别名
本地路径为:URI
网络路径为:定向的URI信息
特点:
两次请求
浏览器地址栏信息会改变
遗留问题:那么问题来了,我们知道,一次请求,如果请求被销毁了,那么请求所包含的信息也就不在了,然后,如果说,我们进行了多次请求,就像登陆网站一样,难道要让用户输入两次账号密码吗?不行,这样会降低用户的网站使用感,那么,就要到了会话及其会话技术了!!!