day08_request&response

来源:互联网 发布:孤独小说家 知乎 编辑:程序博客网 时间:2024/05/29 17:01

1.回顾servlet

servlet ==> server applet ==> 服务器端的小程序

1.1 作用

是用来处理请求(request),完成响应(response)的.

1.2 如何创建一个servlet

*实现servlet接口*继承GenericServlet*继承HttpServlet

1.3 servlet接口中的方法

*init (ServletConfig )*service (ServletRequest , servletResponse )*destory ()*getServletConfig*getServletInfo

1.4 ServletConfig 的 作用.

*getServletName*getInitParameter()*getInitParameterNames()*getServletContext()

1.5 servlet线程是不安全的.

因为在服务器中,一个servlet只存在一个实例.所以当有多个请求同时访问的时候,如果使用成员变量接受线程参数,就会有问题.

解决办法: 使用局部变量接受线程参数.

1.6 url-pattern

路径匹配:   "/"开头  例如: /AServlet 后缀名匹配:  "*"开头 例如: *.do

注意:
1.匹配范围越广优先级越低
2.两种匹配方式不能同时使用.

1.7 load on startup

该配置可以让servlet在服务器启动时加载.
填入的数字表示优先级.数字越小,优先级越高.

1.8 servletContext

范围: 一个项目对应一个servletContext.
获取: 通过servletConfig获取

作用:
1.获得配置文件(web.xml根下的)中的参数

*getInitParameter()*getInitParameterNames()

2.域的功能 => application

增加一个:setAttribute删除一个:removeAttribute获得一个: getAttribute获得所有键: getAttributeNames

3.获得项目内资源

getResourceAsStreamgetRealPath

*以上两个方法都是填写相对路径. “/” ==> 项目的根下(WebRoot)

2 response

代表响应, 可以理解为一个空的箱子,我们在里面填入要发送到浏览器的内容. 服务器会把这些内容组装成http响应.

2.1 响应首行 协议/版本号 状态码 状态码描述

添加状态码 和 描述

    void setStatus(int sc)  只设置状态码    void setStatus(int sc, String sm)   设置状态码和描述    void sendError(int sc) 只设置状态码,错误的    void sendError(int sc, String msg)  设置状态码和描述

2.2 响应头

添加响应头

void setHeader(String name, String value) 设置响应头,如果key一样会覆盖setIntHeader(String name, int value) setDateHeader(String name, long date) void addHeader(String name, String value) 设置响应头,无论如何都新增.void addIntHeader(String name, int value) void addDateHeader(String name, long date)  

2.3 响应空行

2.4 响应正文

发送字节流

getOutputStream

发送字符流

getWriter

2.5 应用.

例一: 手动向浏览器发送404

例二: 重定向

例三: Refresh头.刷新

例四: 发送字节流. 发送中文.

例五: 发送字符流. 发送中文.

字符流和字节流要注意的一个问题:
字节流和字符流一定不能同时使用.

例六:使用字节流发送图片

例七:使用字节流发送文件(文件下载)

3.request对象

封装了浏览器发送来的请求信息.

3.1请求首行 请求方式 请求路径 协议/版本号

    request.getMethod(): GET    request.getRequestURI(): /Day08-request/AServlet    request.getServletPath(): /AServlet    request.getContextPath(): /Day08-request    request.getScheme(): http

3.2 请求头

原始方式获得请求头

String getHeader(String name)  long getDateHeader(String name) int getIntHeader(String name)Enumeration getHeaders(String name)Enumeration getHeaderNames() 

javaee封装好的方法.

request.getContentLength(): -1request.getContentType(): nullrequest.getLocale(): zh_CNrequest.getQueryString(): name=tom&age=18request.getRequestURL(): http://localhost:8080/Day08-request/AServletrequest.getRemoteAddr(): 0:0:0:0:0:0:0:1request.getRemoteHost(): 0:0:0:0:0:0:0:1request.getRemotePort(): 52074request.getServerName(): localhostrequest.getServerPort(): 8080

3.3 请求空行

3.4 请求正文 表单传送过来的键值对

3.5 获得表单提交的参数.

3.5.1.GET

http://localhost:8080/Day08-request/AServlet?name=tom&age=18

乱码:只要确保编码和解码一致,就绝对没有问题.

1.浏览器负责编码.浏览器使用的码表就是表单所在页面的码表.2.服务器负责解码.服务器默认使用ISO-8859-1解码. 如下配置的

URIEncoding来决定解码码表

<Connector port="8080" protocol="HTTP/1.1"  URIEncoding="UTF-8"connectionTimeout="20000" redirectPort="8443" />

如上配置会影响整个服务器不推荐.
我们使用如下代码解决:

//获得参数String name = request.getParameter("name");//因为服务器使用了错误的码表,那么我们按照错误的码表原路返回byte[] nameByte = name.getBytes("ISO-8859-1");//用正确的码表重新解码String newName = new String(nameByte,"UTF-8");

3.5.2 POST

因为Post解码是在第一次调用getParameter之前,那么解决乱码只需要在调用该方法之前设置编码:

request.setCharacterEncoding("UTF-8");  String name = request.getParameter("name");     System.out.println(name);

3.6 涉及到获得表单参数的方法还有哪些呢?

String getParameter 根据键获得值Map getParameterMap()  获得服务器保存表单参数的容器. 就是Enumeration getParameterNames()  获得提交的所有键String[] getParameterValues(String name) 根据键获得值. 获得一键对应多个值的情况的.

3.7 request的请求转发和包含功能

3.7.1 转发:

    一个Servlet处理完毕交给下面的servlet(JSP)继续处理.

作用:
在现实开发中,没有servlet转发给servlet的情况.都是由servlet转发给JSP.
这样可以达到分工的作用:

servlet: 比较适合处理业务.JSP: 比较适合显示功能

注意问题:
servlet中不要做 输出正文的动作,没有结果的
如果放到前面会出现乱码.
但是响应头是可以设置的.

3.7.2 包含:

两个servlet(jsp)共同向浏览器输出内容.
作用:

在现实开发中,多个页面含有相同的内容,我们把相同的内容抽取到一个jsp中,在需要显示这个段内容的jsp中,包含抽取的jsp.可以达到统一管理相同的内容.

3.8 request域的应用

原理:
在request对象中含有一个map.这个map就是request域.

作用:
在将来开发中. 使用请求转发时,servlet处理完数据, 处理结果要交给jsp显示. 可以使用request域将处理结果有servlet带给jsp显示.

操作:

    1.setAttribute  存入一个键值对    2.getAttribute  通过键取出值    3.getAttributeNames 获得域中所有键    4.removeAttribute 跟据键移除一个键值对        

request的范围:

    一个request对象对应一个request域(map)    系统当前有多少个request就有多少request域

3.9 路径总结:

路径分为两种情况:

3.9.1 客户端路径 ==> 给浏览器用的路径

<form action="/Day08-request/AServlet" ><a href="/Day08-request/AServlet" ><img src="/Day08-request/AServlet" >response.sendRedirect("/Day08-request/AServlet")Refresh:3;url=/Day08-request/AServlet

路径写法:

带”/” : “/” ==> 相对于 主机.
例如: 表单所在页面路径为==> http://localhost:8080/Day08-request/login.jsp ==> “/” 代表http://localhost:8080/

不带”/”:(开发中一定不要出现不带”/”的情况).代表从当前目录找.
例如: 表单所在页面路径为==> http://localhost:8080/Day08-request/info/login.jsp ==> 代表 http://localhost:8080/Day08-request/info/

3.9.2 服务器端路径

<url-pattern> /AServlet  ==> http://localhost:8080/Day08-request/AServletrequest.getRequestDispatcher("/AServlet") ==> http://localhost:8080/Day08-request/AServlet

路径写法:
“/”: 相对于项目. “/”==>http://localhost:8080/Day08-request/

4.其它

4.1 get解决乱码

这里写图片描述

4.2 转发&包含

这里写图片描述

4.3 字符流乱码图.

这里写图片描述

4.4 字节流乱码图

这里写图片描述

作业:

完成学生注册.要求:    写一个注册页面    在页面点击注册按钮.将注册信息发送到servlet中.    在servlet中将提交的学生信息交给StudentDao保存到xml中.    提示用户注册成功.    (成功之后,要在xml中看到新注册的学生信息算完成)
0 0