Day8request&response

Day8

request&response

1.   response的简介

http的响应包含三部分组成

组成部分

作用

方法

响应行

状态码

setStatus(int sc) :设置状态码的方法

响应头

是key-value结构, 可以有多个value

setHeader(java.lang.String name, java.lang.String value) :设置响应头, 第一个参数是响应名称;第二个参数值, 针对一个key和一个value情况

addHeader(java.lang.String name, java.lang.String value) :设置响应头, 第一个参数是响应名称;第二个参数值, 针对一个key和多个value的情况

 

响应体

向页面显示的内容

getWriter():使用字符流向页面输出内容

getOutputStream():使用字节流向页面输出内容

2.   重定向☆☆☆

重定向到登录页面

           //设置状态码

           response.setStatus(302);

           //使用头Location完成重定向

           response.setHeader("Location","/day08-1/login.html");

代码简写的方式

           response.sendRedirect("要重定向到的页面的路径");

3.   定时跳转

使用头信息Refresh实现

           写法:response.setHeader("Refresh","在几秒值后跳转;url=要跳转到页面的路径");

 

倒计时的效果

(1)直接在html页面中实现操作

在html中使用meta标签实现页面的定时跳转

         <metahttp-equiv="Refresh"content="3;url=/day08-1/login.html">

 

(2)倒计时

//每一秒向span标签里面写内容

        //bom里面widow对象里面setInterval方法

        varm = 5;

        functionloadTime() {

                 //得到span标签

                 varspan1 = document.getElementById("spanid");

                 //向span里面写内容

                 span1.innerHTML= m;

                 m--;

        }

      setInterval("loadTime();",1000);

4.   设置响应体(向页面输出内容)☆

字节流

代码

           response.getOutputStream().write("输出的内容".getBytes());

 

           解决中文乱码问题

           //设置浏览器的编码 使用头信息 Content-Type

           response.setHeader("Content-Type","text/html;charset=utf-8");

           //设置字节数组的编码

           response.getOutputStream().write("字节流中文".getBytes("utf-8"));

 

字符流

代码

           response.getWriter().write("response");

 

           解决中文乱码问题

           //设置response缓冲区的编码

           response.setCharacterEncoding("utf-8");

           //设置浏览器的编码

           response.setHeader("Content-Type","text/html;charset=utf-8");

           response.getWriter().write("字符流中文");

简写方式

           response.setContentType("text/html;charset=utf-8");

 

5.   response的流的注意事项

1.字节流和字符流是互斥的

2.使用字符流不能直接向页面输出数字

 

6.   验证码的案例

1. 实现验证码的步骤

第一步:生成图片

第二步:生成随机的数字和字母

第三步:把数字和字母画到图片上

           第四步:把图片显示到页面上

2. 显示验证码

(1)把验证码显示到登录的页面中

           <img src="验证码的servlet的路径"/>

(2)实现看不清换一张

           //实现看不清换一张

           function loadCode() {

                    //得到img标签

                    var img1 =document.getElementById("img1");

                    img1.src ="/day08-5/code?"+new Date().getTime();

                    }

7.   文件下载的案例

1.实现的步骤

(0)设置头信息 Content-Disposition,无论是什么格式的文件都以下载方式打开

(1)在服务器上面有一个可以下载的文件

(2)从服务器上拿到这个文件(使用文件输入流得到文件)

           (3)使用输出流把文件写到浏览器

2. 代码实现文件的下载

           //得到要下载文件的路径

           String path =getServletContext().getRealPath("/down/a.zip");

           //得到文件的名称

           //得到最后一个\位置,根据位置进行截取

           int lens =path.lastIndexOf("\\");

           String filename =path.substring(lens+1);

           //设置头信息

           response.setHeader("Content-Disposition","attachment;filename="+filename);

           //得到文件的输入流

           InputStream in = newFileInputStream(path);

           //使用输出流操作

           OutputStream out =response.getOutputStream();

           //流对接

           int len = 0;

           byte[] b = new byte[1024];

           while((len=in.read(b))!=-1) {

                    out.write(b, 0, len);

           }

           //关闭流

                    in.close();

8.   request

获取请求行的信息

☆(1)getMethod() :得到http请求方式

☆(2)getRequestURI() :得到请求地址(不包含ip+端口号)

           (3)getProtocol():得到http的版本

获取请求头的信息

                   (1)getHeader(java.lang.Stringname) :根据名称得到请求头的值

                            User-Agent:获取当前请求的浏览器的类型

                            String agent =request.getHeader("User-Agent");

         获取客户机的信息

                   ☆(1)getContextPath():请求项目的名称

                   ☆(2)getRequestURL():客户端发送的请求的路径

                   (3)getRemoteAddr():获取当前客户端的ip地址

         ☆☆☆获取表单提交的数据

(1)      ☆String getParameter(java.lang.String name) :参数是表单输入项name属性的值,根据名称得到输入的值

(2)      ☆String[] getParameterValues(java.lang.String name) :参数是表单输入项name的值,针对复选框的情况

(3)      Map<java.lang.String,java.lang.String[]>getParameterMap() :返回的是map集合,key是表单输入项name属性的值,value是输入的值

(4)      Enumeration<java.lang.String>getParameterNames()

 

获取表单提交的中文数据乱码问题的解决

(1)      post提交方式解决方法

设置request缓冲区的编码

代码:request.setCharacterEncoding("utf-8");

(2)      get提交中文乱码解决

第一种:修改tomcat的配置文件

   <Connector port="80"protocol="HTTP/1.1"

 connectionTimeout="20000"

    redirectPort="8443" URIEncoding="utf-8"/>

                                     第二种:把数据先编码,再进行解码

                                     第三种:使用string构造进行编码

                                               代码:username =new String(username.getBytes("iso8859-1"),"utf-8");

                  

 

☆☆☆request是域对象

(1)      域对象:在一定的范围内,可以存值和取值

(2)      servletContext域对象:范围是整个web项目,存值setAttribute方法和取值 getAttribute方法

(3)      request也是一个域对象:范围是一次请求,存值和取值

向request域里面存值的方法:setAttribute(java.lang.String name, java.lang.Object o)

从request域里面取值的方法:getAttribute(java.lang.String name)

(4)      request域对象范围是一次请求,经常和转发一起使用

代码 request.getRequestDispatcher("转发的路径 不带项目名称").forward(..);

 

举例演示request域对象

创建servlet1,在servlet1里面向request域里面设置一个值,最后转发到servlet2里面

         //向request域里面设置一个值

         request.setAttribute("msg","itcast100");

         //转发到servlet2

         request.getRequestDispatcher("/servlet2").forward(request,response);

 

         创建servlet2,在servlet2里面获取通过servlet1向request域里面设置的那个值

         //获取通过servlet1向request里面设置的值

         response.getWriter().write(""+request.getAttribute("msg"));

 

☆☆☆重定向和转发的区别

         (1)重定向

         =重定向请求两次,请求的地址带项目名称

         =302+Location实现重定向的操作

         =response.sendRedirect("路径带项目名称");

 

         (2)转发

         =转发请求一次,路径不需要带项目名称(在服务器内部进行操作)

         =request.getRequestDispatcher("转发的路径 不带项目名称").forward(request,response);

 

         (3)重定向:从一个网站到另外的一个网站

              转发:请求的过程中需要携带数据操作

 

9.   转发的案例

9.1 使用request域对象+转发实现登录功能

         (1)创建登录页面,在登录页面中写表单,提交到servlet里面

         (2)创建servlet,在servlet里面获取表单提交的数据,判断用户名和密码是否正确

         (3)如果用户名和密码都正确,表示登录成功,向页面输出内容

         (4)如果用户名或者密码错误,表示登录失败,转发到登录页面(同时向页面显示错误信息)

         = 转发的代码:request.getRequestDispatcher("登录的页面 不带项目名称").forward(request,response);

         = 传递数据的页面:首先把显示内容放到request域里面,使用转发到登录页面,在登录页面中使用el表达式获取

         request域里面的值

 

9.2 知识的引入

         (1)jsp:sun公司用于动态网站的技术,jsp就是servelt,最终会编译成servlet

         (2)el表达式:用于获取域对象里面的值  ${名称}

 

9.3 代码的实现

         1、创建页面,写表单,表单里面写两个输入项,提交到servlet里面

         2、创建servlet,在servlet获取表单数据,判断(用户名admin,密码 123456)是否正确

         3、如果都正确,向页面输出success

         4、如果有一个错误的,转发到登录页面,同时携带错误信息到页面中显示

        

9.4 代码

         //获取表单提交的用户名和密码

         String username =request.getParameter("username");

         String password =request.getParameter("password");

         //判断 用户名 admin,密码 123456

         if("admin".equals(username)&& "123456".equals(password)) {

                   //登录成功

                   response.getWriter().write("loginsuccess");

         } else { //登录失败

                   //转发到登录页面,同时向页面传递错误的信息

                   //把错误信息存到request域里面

                   request.setAttribute("msg","用户名或者密码错误");

                   request.getRequestDispatcher("/login.jsp").forward(request,response);

         }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UA_StatusCode OpcuaClient::ReadCNCValue(CString dataCategory,CNCStruct* m_pCncstruct) { const int arraySize = 7; UA_ReadValueId CNC_itemArray[arraySize]; for (int i = 0; i < arraySize; ++i) { UA_ReadValueId_init(&CNC_itemArray[i]); CNC_itemArray[i].attributeId = UA_ATTRIBUTEID_VALUE; } CNC_itemArray[0].nodeId = UA_NODEID_STRING(2, "不知道是哪一个变量);//cncType CNC_itemArray[1].nodeId = UA_NODEID_STRING(2, "/Channel/Configuration/numSpindles");//主轴数 CNC_itemArray[2].nodeId = UA_NODEID_STRING(2, "/Channel/Configuration/numGeoAxes");//伺服轴数 CNC_itemArray[3].nodeId = UA_NODEID_STRING(2, "/Channel/ProgramInfo/progName");//程序名称 CNC_itemArray[4].nodeId = UA_NODEID_STRING(2, "/Channel/Spindle/status");//运行状态 CNC_itemArray[5].nodeId = UA_NODEID_STRING(2, "/Channel/MachineAxis/actFeedRate");//进给速度 CNC_itemArray[6].nodeId = UA_NODEID_STRING(2, "/Channel/Spindle/actSpeed");//主轴转速 //读数据 UA_ReadRequest request; UA_ReadRequest_init(&request); request.nodesToRead = &valueIdCategory[0]; request.nodesToReadSize = arraySize; UA_ReadResponse response = UA_Client_Service_read(m_Client, request); UA_StatusCode *retStatusArray=NULL; UA_StatusCode retval = response.responseHeader.serviceResult; if (retval == UA_STATUSCODE_GOOD) { if (response.resultsSize == arraySize) { for (int i = 0; i < arraySize; ++i) { retStatusArray[i] = response.results[i].status; } } else { UA_ReadResponse_clear(&response); return UA_STATUSCODE_BADUNEXPECTEDERROR; } } //按顺序存储plc的节点值 vector<void*> cncNodeValue; for (int i = 0; i < arraySize; ++i) { if (retStatusArray[i] == UA_STATUSCODE_GOOD) { UA_DataValue res = response.results[i]; if (!res.hasValue) // no value { UA_ReadResponse_clear(&response); return UA_STATUSCODE_BADUNEXPECTEDERROR; } UA_Variant out; memcpy(&out, &res.value, sizeof(UA_Variant)); UA_Variant_init(&res.value); if (out.type == &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]) { UA_LocalizedText* ptr = (UA_LocalizedText*)out.data; printf("Text: %.*s\n", ptr->text.length, ptr->text.data); cncNodeValue.push_back(ptr->text.data); } else if (out.type == &UA_TYPES[UA_TYPES_UINT64]) { UA_UInt64* ptr = (UA_UInt64*)out.data; printf("UInt64 Value: %d\n", *ptr); cncNodeValue.push_back(ptr); } else if (out.type == &UA_TYPES[UA_TYPES_UINT32]) { UA_UInt32* ptr = (UA_UInt32*)out.data; printf("UInt32 Value: %d\n", *ptr); cncNodeValue.push_back(ptr); } else if (out.type == &UA_TYPES[UA_TYPES_FLOAT]) { UA_Float* ptr = (UA_Float*)out.data; printf("Float Value: %d\n", *ptr); cncNodeValue.push_back(ptr); } else if (out.type == &UA_TYPES[UA_TYPES_DATETIME]) { UA_DateTime* ptr = (UA_DateTime*)out.data; UA_DateTimeStruct ptrdts = UA_DateTime_toStruct(*ptr); printf("DateTime Value: %u-%u-%u %u:%u:%u.%03u\n", ptrdts.day, ptrdts.month, ptrdts.year, ptrdts.hour, ptrdts.min, ptrdts.sec, ptrdts.milliSec); cncNodeValue.push_back(ptr); } } } //问题三:数据如何处理成人可读或者可显示的形式?? UA_ReadResponse_clear(&response); return UA_STATUSCODE_GOOD; }
02-06
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值