[Java拾遗四]JavaWeb基础之Servlet_Request&&Response
今天来回顾下之前学过Servle的Resquest以及Response的知识.1,Request和Response技术:??? rr的作用:??????? request是请求,封装用户的请求信息.若想获取请求信息,找request就行了??????? response是响应,封装服务器的响应信息,若想往页面写东西,找response就可以了??? rr的体系结构:??????? request??????? 在servlet中有一个service(ServletRequest,ServletResponse)? 抽象方法??????? 在HttpServlet中实现了service(ServletRequest,ServletResponse)??????? 并且重载了service(HttpServletRequest,HttpServletResponse)??????? ??????? request的实现类 org.apache.catalina.connector.RequestFacade??????? response的实现类 org.apache.catalina.connector.ResponseFacade??????? ??????? request的体系??????????? ??????????? ?????? response的体系?????????? 2,Response?? (1)作用:响应??????? http响应的格式:??????????? 响应行 响应头 响应体??? (2)简单介绍api??????? 操作响应行:??????????? 响应行的格式:??????????????? 协议/版本 状态码 状态码说明??????????????? HTTP/1.1 200 OK??????????? 常用的方法:??????????????? setStatus(int)??????????????? sendError(int)??????????????? sendError(int,msg)??????? 操作响应头:??????????? 响应头的格式:??????????????? key:name??????????????? key:name1,name2? --多个值的时候用逗号隔开??????????? 常用的方法:??????????????? setHeader(string,string)??????????????? setIntHeader(string,int)??????????????? addHeader(string,string)??????????????? setDateHeader(string,long)??????? 操作响应体:??????????? 响应题就是展示的内容??????????????? getOutputStream()??????????????? getWriter()??? (3)详解api?????? a,状态码:??????????? 1xx:正在请求中??????????? 2xx:完成请求响应??????????????? 200:成功完成??????????? 3xx:还需浏览器进一步操作??????????????? 302:还需跳转??????????????? 304:浏览器去读缓存??????????? 4xx:用户请求错误??????????????? 404:路径不存在??????????? 5xx:服务器错误:??????????????? 500:服务器错误b,操作响应头:??????????? 响应头的格式:??????????????? key:name??????????????? key:name1,name2? --多个值的时候用逗号隔开??????????? 常用方法:??????????????? setHeader(String key,String name):给响应设置指定的头信息??????????????? addHeader(String key,String name1):若存在则追加,反之则设置??????????????? ??????????????? setIntHeader(String key,int value):给响应设置指定的头信息(int类型的)??????????????? addIntHeader(String key,int value):若存在则追加,反之则设置??????????????? ??????????????? setDateHeader(String key,Long long):给相应头设置毫秒值的????? ? 案例:??????????? 重定向:??????????????? 302:还需要跳转??????????????? 需要用到location??????????????? 代码实现:??????????????????? setStatus(302);??????????????????? setHeader("location","跳转的路径");??????????????? 开发中时使用??????????????????? sendRedirect(跳转的路径);??????????? 刷新:??????????????? response.setHeader("refresh","3;url=跳转的路径");??????????????? ??????????? 代码案例:使用location跳转: doGet(HttpServletRequest request,HttpServletResponse response) 302
response.setHeader("location","/dayaugmentum10/loca2"
使用refresh跳转: doGet(HttpServletRequest request,IOException {
response.setHeader("refresh","3;url=/augmentum/1.html"
c,操作响应体:??????? 常用的方法:??????? ServletOutputStream getOutputStream():字节流??????? PrintWriter getWriter():字符流??????? ??????? 通过流对象.println(任意内容);??? 字符乱码的处理??????? 设置响应信息的编码格式??????????? response.setCharacterEncoding("utf-8"):??????? ??????? 设置响应信息的编码格式并且通知浏览器用什么编码打开??????????? response.setHeader("content-type","text/html;charset=utf-8");??????????? 开发中使用??????????? ??????????? ??????? 在页面添加??????? ??? 注意事项(针对流)??????? ??? 验证码:??????? 作用:防止恶意暴力破解密码 doGet(HttpServletRequest request,IOException {
charNum = 4 width = 30 * 4 height = 30
BufferedImage bufferedImage =
Graphics graphics =
graphics.fillRect(0,0
graphics.drawRect(0,width - 1,height - 1
graphics.setFont( Font("宋体",Font.BOLD,20
Graphics2D graphics2d = String s = "ABCDEFGHIGKLMNOPQRSTUVWXYZ01234567890" Random random =
String msg="" x = 5 ( i = 0; i < 4; i++ index = random.nextInt(26 String content = msg+= theta = random.nextInt(45) * Math.PI / 180 graphics2d.rotate(theta,x,18 graphics2d.drawString(content,18 graphics2d.rotate(-theta,18 x += 30
( i = 0; i < 5; i++ x1 = x2 =
y1 = y2 =
ImageIO.write(bufferedImage,"jpg"
}
3,Request??? 请求.若想获取请求信息,找我就可以了??? 请求的格式:??????? 请求行 请求头 请求体??? (1)api简介??????? a,请求行??????????? 格式:请求方式 资源路径 协议/版本??????????? 例如:GET /augmentum/1.html HTTP/1.1??????????? 常用方法:??????????????? getMethod()??????????????? getRequestURI()??????????????? getProtocol()??????????????? getQueryString()?????? b,请求头??????????? 格式:??????????????? key:name1[,name2]??????????? 常用方法:??????????????? String getHeader(key)??????????????? Enumeration getHeaders(key)??????????????? Enumeration getHeaderNames();??????????????? ??????????????? getIntHeaders(key)?????? c,请求体??????????? ??????????? 例如 username=tom&password=123&hobby=eat&hobby=sleep??????????? 常用方法:??????????????? String getParameter(key)??????????????? Enumeration getParameterNames()??????????????? Map doGet(HttpServletRequest request,IOException {
String addr =
String url =
String contextPath = }
请求头:??????????? 格式:??????????????? key:name1[,name2]??????????? 常用方法:??????????????? String getHeader(key):获取指定的头信息??????????????? int getIntHeader(key):??????????????? long getDateHeader(key):? 防盗链??????????????? String referer = request.getHeader("referer" (referer=="地址栏来的 可以访问" (referer.startsWith("http://localhost/augmentum""站内访问""站外访问"
c,请求体:??????????? ??????????? get请求和post通用的方法:??????????? 获取用户参数:??????????????? String getParameter(key):获取指定的参数信息??????????????? String[] getParameterValues(key):以string[]的格式返回指定的参数信息??????????????? ??????????????? Map doGet(HttpServletRequest request,IOException {
String username = request.getParameter("username""姓名:"+
String[] hobby=request.getParameterValues("hobby""爱好:"+
System.out.println("----------------------"
String name </span>=<span style="color: #000000;"> params.nextElement();
System.out.println(name</span>+":"+<span style="color: #000000;">Arrays.toString(request.getParameterValues(name)));
}
} d,域对象:??????????? request:??????????????? ??????????????? 请求串,请求链??????????????? request.getRequestDispatcher("转发路径").forward(request,response)??????????????? 服务器内部跳转??????????????? 客户端的路径:?? /工程名/编写的路径??????????????? 服务器的内部路径:?? /编写的路径??????????? 常用方法:??????????????? xxxAttribute()??????????????? setAttribute(String,Object);??????????????? Object getAttribute(String)??????????????? removeAttribute()??????????? 请求转发与重定向的区别?????? ??????? 2.请求转发,只有一次请求,一次响应.??????? 重定向,有两次请求,两次响应。 ??????? 3.请求转发存在request域,可以共享数据.??????? 重定向不存在request域。 ??????? 4.请求转发只能在服务器的内部跳转,简单说,只能访问本站内资源。??????? 重定向可以访问站外资源,也可以访问站内资源. ??????? 5.请求转发是由request 发起的 . request.getRequestDispatcher().forward()??????? 重定向是由response 发起的? response.sendRedirect(); ??????? 6.请求转发与重定向时路径写法不一样.??????? 重定向要跳转的路径是从浏览器在次发起的,是浏览器端路径,写法: /工程名/资源??????? 请求转发是服务器内部跳转,这时它与浏览器无关 写法:/资源 请求的中文乱码:??? 浏览器地址栏使用utf-8编码??? tomcat7使用的iso8859-1编码??? ??? 参数使用utf-8编码,tomcat使用iso-8859-1进行解码出现了乱码.??? 解决的思路:??????? 把接受的参数先iso-8859-1编码,然后使用utf-8进行解码??????? 对于post请求和get请求可以通过??????????? new String(name.getBytes("iso8859-1"),"utf-8");??????? 对于post请求还可以使用??????????? request.setCharacterEncoding("utf-8"); ??????? ??????? 乱码解决过程??????? ??????? String s="赵四";??????? String s1=URLEncoder.encode(s,"utf-8");??????? String s2=URLDecoder.decode(s1,"iso8859-1");??????? System.out.println(s2);??????? ??????? //先使用iso8859-1编码??????? String s3 = URLEncoder.encode(s2,"iso8859-1");??????? //使用utf-8解码??????? String s4 = URLDecoder.decode(s3,"utf-8");??????? System.out.println(s4); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |