Day07_request-response


01 Request入门

客户端向服务器发送请求时,会将所有的请求都封装在HttpServletRequest对象当中,那么我们就可以通过这个对象获取客户端的一些有用数据。

★02 Request对象常用API

对于POST请求,表单项不填,那么request.getParameter()返回,返回”“空白字符串

  • requeset获取客户端的信息

getRequestURL()方法返回客户端发出请求时的完整URL
getRequestUR()I方法返回请求行中的资源名部分
getQueryString() 方法返回请求行中的参数部分
getRemoteAddr()方法返回发出请求的客户机的IP地址
getLocalAddr()方法返回WEB服务器的IP地址
getMethod()方法返回客户机请求方式
getServletPath()方法返回Servlet映射路径
request.getContextPath()方法返回当前web应用根目录

对于GET方式,请求参数是写在请求行中
对于POST方式,请求参数是写在请求体中
表单不写mothod,默认是GET请求。

  • 获取请求头的信息

获得客户机请求头
getHeader(name)方法 — String
getHeaderNames方法 — Enumeration

  • 获得请求体的参数

getParameter(name) —返回 String 通过name获得值 getParameterValues(name) —返回String[ ] 通过name获得多值 getParameterNames — 返回Enumeration<String> 获得所有name

★03 Request对象的应用

用户注册

★04 表单乱码的原因和解决方案

服务器的默认编码方式ISO8859-1编码,;而浏览器是UTF-8,

解决办法
1. response.setContentType("text/html;charset=UTF-8"); 服务器设置浏览器的解码方式
2. request.setCharacterEncoding("UTF-8")只能针对post请求。直接设置请求的编码
3.

    //读取进来就就是被ISO编码了。现在我们需要继续把它编码成为二进制文件,然后用UTF-8去解码
    byte[] buf = username.getBytes("ISO8859-1");
    username = new String(buf,"UTF-8");

★05 Request域对象

request对象同时也是一个域对象,开发人员通过request对象在实现转发时,把数据通过request对象带给其它web资源处理。
个人理解就是生存在服务器端的一个对象。这样我们既可以在服务器端传递数据,而浏览器端的地址不会改变

request.setAttribute("NAME", username);设置域对象属性
getAttribute("NAME")获取对应的值
removeAttribute("NAME")移除对应的域对象。

    //把这个页面重新转发到其他servlet中,这里的"/"代表程序的跟目录 
        request.getRequestDispatcher("/Demo02B").forward(request, response);        

★06 转发的细节

如上

07 练习:用户注册

08 Response入门

web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象。
用于服务器将数据发送到客户端。`HttpServletResponse`

★09 Response对象常用的API

response.setContentType("text/html;charset=UTF-8");两层含义:一层是让服务器按照UTF-8编码。一层是让浏览器按照UTF-8的方式解码。

当你想输出中文字符串时,可以采用字符或者字节的方式

  1. 字符 response.getWriter()

  2. 字节response.getOutputStream()

★10 Response对象的应用

  1. 文件下载。
    //设置浏览器响应方式。下载
        response.setHeader("content-disposition","attachment;filename="+fileName);

<a href="/Day07_itcaset_request-response/Demo03">下载</a>
// "/"就是服务器webapps的根目录,Demo03是存在WEB-INF目录下面,但是浏览器是无法访问这个目录的。/Demo03是我们在web.xml目录下配置的映射目录
  1. 验证码(设置浏览器不缓存)

    response.setDateHeader("expires",-1);
    response.setHeader("cache-control","no-cache");
    response.setHeader("pragma","no-cache");
    

★11 Response向浏览器输出中文乱码的原因和解决方案

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

★12 重定向的细节

在重定向的情况下,原来的`request`的域对象不能用了。我们用servletContext域对象替代。

servletContext域对象在部署的时候就创建了。 所以我们在

    //由Demo09A重定向到Demo09B中,这里的/表示webapps目录
response.sendRedirect(request.getContextPath()+"/Demo09B");

★13 RequestDispatcher对象常用的API

在第5条我已经做了简述

### 14 练习:用户登录和JS验证登录表单
老师的08练习问题。

在得到验证码图片的时候可以通过javaScript的开动态改变img标签的src属性。

function shuaxin() {
    document.getElementById("imgID").src = "/Day07_itcaset_request-response/Demo04?" + new Date().getTime();
            }
  • 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、付费专栏及课程。

余额充值