扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
两个页面之间传递值是可以用request来管理,没有必要使用session。有点太浪费。你可以先在一个页面往请求写你的数据,由于你是需要从url中获得值,所以可以直接在另一页面中通过
网站建设哪家好,找成都创新互联!专注于网页设计、网站建设、微信开发、小程序设计、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了安新免费建站欢迎大家使用!
request.getParameter("key")来获得你的值.这样是最简单的方法。
也可以使用request.setAttribute("key"),
然后使用(String)request.getAttribute("key")来获取。建议使用第一种。
知识先填坑:
假设访问路径为:**/learn/js_basics/11.html?a=100b=20c=30;
分别通过【正则匹配】、【拆分字符串成数组】、【新API URLSearchParams】三种方式获取参数方法如下:
思路:
两次用到split方法,第一次将每个参数和值拆分为数组中的一个值;
遍历这个数组,每个参数和值再次分割,分别将参数和值赋值给一个对象的属性和值;
调用方法通过对象的属性,获取改值
如果你是指两个页面之间的传值,那么可以这么做:
简单的话,可以通过URL传值,比如
可以通过读取url的参数name获得gem。
也可以通过session,cookie等方法,这两种方法就有一些限制,比如换个浏览器,session和cookie就不一样了,那么你传的值就不存在了。
所以第一种会比较通用。
如果是传值给模板(一般是模板引擎之类的,比如html/template),这些教程很多,搜一下比较快速解决
用JS获取地址栏参数的方法(超级简单)
方法一:采用正则表达式获取地址栏参数:( 强烈推荐,既实用又方便!)
function GetQueryString(name){ var reg = new RegExp("(^|)"+ name +"=([^]*)(|$)"); var r = window.location.search.substr(1).match(reg); if(r!=null)return unescape(r[2]); return null;} // 调用方法alert(GetQueryString("参数名1"));alert(GetQueryString("参数名2"));alert(GetQueryString("参数名3"));
下面举一个例子:
若地址栏URL为:abc.html?id=123url=
那么,但你用上面的方法去调用:alert(GetQueryString("url"));
则会弹出一个对话框:内容就是
如果用:alert(GetQueryString("id"));那么弹出的内容就是 123 啦;
当然如果你没有传参数的话,比如你的地址是 abc.html 后面没有参数,那强行输出调用结果有的时候会报错:
所以我们要加一个判断 ,判断我们请求的参数是否为空,首先把值赋给一个变量:
var myurl=GetQueryString("url");if(myurl !=null myurl.toString().length1){ alert(GetQueryString("url"));}
这样就不会报错了!
let url=" ;name=srval=aaa ";
拿到以下结果
/*
第二种方式基于正则封装
先配置Header最长读取时间、req最长读取时间、req最大读取长度默认6M。
RFC7230禁止\r\n参数,Url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符。但go net/http包放宽了这个要求。
先构建newTextprotoReader,由于缓冲区是对象复用的,用完后要defer put。共完以以下解析任务:
TextprotoReader数据结构,将字节码Reader转成文本Reader。
第一步,从第一行解析出method uri prototype。
第二步解析URL。url.URL数据结构:
解析Scheme,协议前缀(小写)。有查询参数?,则配置url.ForceQuery url.RawQuery。有认证信息///...//,则解析url.User url.Host。最后配置url.Path和url.RawPath,如果Path==RawPath,则RawPath=""。
第三步解析MIMEHeader。
第四步readTransfer。重新配置如下参数:RequestMethod ProtoMajor ProtoMinor Header Trailer ContentLength Close。对于Body,如果encodings支持chunked,读取流用chunkedReader包裹。默认情况用LimitedReader,无body赋空的struct{}。
以下情况返回非空err,示得到正确的请求:
最后配置req.ctx req.RemoteAddr req.TLS body.doEarlyClose = true。
构建Response:
其中closeNotifyCh必须在构建时初始化,没有content所以先置contentLength为-1。
配置w.cw并被w.w包裹。w.cw缓冲默认大小2M。
获取Request可能出现如下错误:
先上响应数据结构:
response字段可以分类为:大对象、缓冲、KV对或bool型的状态参数。
大对象有:
状态字段:
chunkWriter数据结构:
chunkWriter包裹了Response,功能之一是完成Header设置,包括Content-Type Content-Length chunk-header。bufio.Writer是chunkWriter是缓冲包裹。
handler将响应写入到response.w。
调用w.w.Flush()将w写入到cw,注意到Flush()操作,如果未刷空缓存并报错,触发拷贝操作。报错不会退回已写出的数据。
进而调用cw.Write(),根据cw.chunking参数。
putBufioWriter(w.w)清空resp.w缓冲,如果池化放回sync.pool。
根据chunkWriter的定义,w.cw.close()负责cw的结束工作:写入换行符和resp.trailers数据。
最后刷新TCP缓冲w.conn.bufw.Flush(),完成响应包发送。并正确关闭request。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流