springmvc 的controller 层如何获取到请求的数据
javaweb应⽤开发,最常⽤到的就是应⽤之间的信息交互,调⽤别的应⽤模块得到⾃⼰想获取的数据信息,然后解析数据并进⾏处理返回到上⼀层。那controller层的⽅法如何获取http请求/webservice请求中的参数,或者说请求数据呢?
按照我个⼈的接触和理解,把请求可以分为两⼤类:
1.页⾯请求到后台controller层的请求。
2.别的应⽤http/webservice调⽤本应⽤中封装接⼝的请求。
⽆论哪种⽅式的请求,都是http请求(webservice底层也是http请求,待考证),controller层对请求数据的解析是按照json还是xml的依据就是请求头content-type,接下来我们就先来详细介绍⼀下。
content-type
content-type请求头是⼲吗的呢,http请求头有四种类型,分别是通⽤头部,请求头部,响应头部以及内容头部.
⾸先,我们要弄清楚,content-type是属于内容头部,既然是内容头部,那这个请求头是⽤来向接收端解释传递的该内容主体的,content-type的取值是告诉服务端,你传递过去的内容是啥,你应该准备好如何接收和解析。常⽤的content-type可以分为application/x-www-form-urlencoded  , multipart/form-data  ,application/json  , text/xml 四种。下⾯⼀⼀介绍
1.application/x-www-form-urlencoded
application/x-www-form-urlencoded是常⽤的表单发包⽅式,普通的表单提交(即不带⽂件上传的提交),或者js (例如:post⽅式)发包,默认都是通过这种⽅式,提交代码demo如下:
请求头信息如下所⽰,可以看到content-type和FormData(表单的数据格式)
如何获取这种数据结构的请求?有两种⽅式来解决
1.1 String 参数值=Parameter(“参数名”);(以springmvc 的controller层的⽅法为例)
function  searchInfo () {
$("#cxjg").datagrid({
url : basepath + 'jijin/getList',
queryParams : getParam($("#query").serializeArray()),
method : "post"
});
function  searchInfo (){
$("#cxjg").datagrid({
url:basepath+'jijin/getList',
queryParams : {'age':23,'name':'zhangsan'},
method:"post"
});
@RequestMapping("/getParam")
public String getParamFromRequest(HttpServletRequest request){
String jiJinCode=(Parameter("jinJinCode");
...
}
1.2 Map<String,String[]> ParameterMap();
@RequestMapping("/getParam")
public String getParamFromRequest(HttpServletRequest request){
Map<String,String[]> ParameterMap();
StringBuffer inputDate=new StringBuffer();
inputDate.append("<jiJinBean>");
for(Map.Entry<String,String[]> entry :Set()){
String Key();
String[] Value();
String value=null;
if(values.length>0){
value=values[0];
}
inputDate.append("<"+key+">"+value+"</"+key+">");
}
String();
}
两种⽅法⽐较来说,第⼀种适合当参数不多时,可以⼀个⼀个取。但第⼆种则是遍历出所有的请求参数,并⽣成标签格式,利于⾃动⽣成报⽂格式。
2.multipart/form-data
multipart/form-data⽤在页⾯(提交)发送⽂件的POST请求。之所以会和第⼀种content-type同是post提交,为啥在这⾥就变成multipart/form-data了呢?当然程序不会⾃动识别是不是⽂件,⽽是我们在<form>这个标签⾥加上了这句话:enctype="multipart/form-data",这才是让请求头发⽣变化的原因!具体代码demo如下
$("#batchAddInfo").form('submit',{
url:basepath+"jijin/fileUpload",
onSubmit:function(){},
success:function(data){
data=eval('('+data+')');
var flag=data.flag;
if(flag){
$("#batchDivDialog").window("close");
$.messager.alert('提⽰',"批量新增成功!");
searchInfo();
}else{
$("#batchDivDialog").window("close");
$.messager.alert('提⽰',"批量新增失败!");
searchInfo();
}
}
});
对应的⾕歌页⾯request调试信息如下:
这⾥Content-Type告诉我们,发包是以multipart/form-data格式来传输,另外,还有boundary⽤于分割数据。
这种⽅式的请求数据如何获取?出⽂件外的表单参数值当然还是和上⾯⼀样——Parameter(“parameterName”)来获取,不⼀样的是⽂件怎么来获取?要⽤到MultipartHttpServletRequest,这个MultipartHttpServletRequest 继承于
HttpServletRequest,MultipartRequest。我们要从这个⼦类⾥⾯来获取,具体代码如下:
这种请求头⼀般出现实在webservice请求时才会有。由于别的应⽤请求我们,所以我们这边就是服务端,他们是客户端。这⾥⽆法⽤浏览器模拟,只能给出客户端和服务端代码,然后看如何解析客户端的请求数据。 客户端代码;
@RequestMapping("/fileUpload")
public  void  fileUpload (HttpServletRequest request,HttpServletResponse response){
InputStream is =null ;
//创建解析器
CommonsMultipartResolver resolver=new  Session().getServletContext());
//判断request 是否有⽂件上传,即多部请求
if (resolver.isMultipart(request)){
MultipartHttpServletRequest multiRequest=(MultipartHttpServletRequest)request;
//获取多部request 中的⽂件名
Iterator<String> FileNames();
while (iter.hasNext()){
//取得上传的⽂件
MultipartFile ());
if (file!=null ){
is =new  Bytes());
}
}
}
Workbook wb=new  XSSFWorkbook(is );
...
}
public class AxisClientTest {
public static void main(String[] args) throws Exception {
String nameSpaceURI = "com.serviceTargetName";
String publishUrl = "localhost:8080/springCXFWebserviceDemo01/service/HelloWorldService?wsdl";
Service service = new Service();
// 通过service创建call对象
Call call = (Call) ateCall();
// 设置webservice接⼝地址
call.setTargetEndpointAddress(new URL(publishUrl));
call.setOperationName(new QName(nameSpaceURI, "sayHello"));
call.addParameter("parameterName", XMLType.XSD_STRING, ParameterMode.IN);
call.setReturnType(XMLType.XSD_STRING);
// 给⽅法传递参数,并且调⽤⽅法
String name = "zhanglifeng";
String temp = getXml(name);
// 这⾥的obj{}是放⼊⼏个⼊参,完全由service提供的接⼝⽅法的⼊参决定,且顺序和你存放的顺序⼀致!⼀般⼊参为String类型的xml报⽂,回参也是xml报  Object[] obj = new Object[] { temp };
String result = (String) call.invoke(obj);
}
private static String getXml(String name) {
StringBuffer sb = new StringBuffer(
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
sb.append("<userBean>");
sb.append("<userName>" + name + "</userName>");
sb.append("</userBean>");
String();
}
}
上⾯的⽅法getXml(String name)就是客户端发给服务端的请求:
<?xml version="1.0" encoding="UTF-8"?>
<userBean>
<userName>" + ⼊参:⼈名 + </userName>
</userBean>
下⾯我们再看服务端,也就是我们这边接受请求的代码是啥样的:
/**
* 由于实现类和接⼝不在同⼀个包中。所以要加上targetNamespace属性。
* 另外,这⾥的endpointInterface是实现类对应接⼝的全路径
* @author Administrator
*/
@WebService(targetNamespace="com.serviceTargetName",endpointInterface="com.zlf.HelloWorld")
@Component("HelloWord")//spring注⼊⽤
eval是做什么的
public class HelloWorldImpl implements HelloWorld {
@Override
public String sayHello(String str) {
String username="aaa";
Document document = XMLUtils.parse(str);
//⾸先接⼝开发肯定是双发都知道此⽅法要接受的报⽂格式的。我们获取报⽂中⼈名对应的节点即可。
Node node = ElementsByTagName("userName").item(0);
if(node !=null){
TextContent();
}
return"你好,"+username+"  你已成功访问了webservice服务端!" ;
}
}
这⾥我们是直接拿着⼊参str进⾏Documen解析,因为客户端的请求数据已经绑定到这个⼊参上了。由于我们知道他的请求报⽂格式是xml 的,所以可以进⾏Document转换,然后我们从节点中取值既可以实现请求数据的解析了。
解析的代码请查看我以前的博⽂:⽂的最后就是这个解析的⼯具类。
4.application/json
application/json 这个 Content-Type 作为响应头⼤家肯定不陌⽣。实际上,现在越来越多的⼈把它作为请求头,⽤来告诉服务端消息主体是序列化后的 JSON 字符串。由于 JSON 规范的流⾏,除了低版本 IE 之外的各⼤浏览器都原⽣⽀持 JSON.stringify,服务端语⾔也都有处理 JSON 的函数,使⽤ JSON 不会遇上什么⿇烦。
JSON 格式⽀持⽐键值对复杂得多的结构化数据,这⼀点也很有⽤。
这个请求头还有⼀个特殊点就是页⾯通过jquery过来的数据结构和其他应⽤请求的数据结构不⼀样,因为jquery对json的数据做了转换:
"data":{
"mobilenum":"158********",'age':23,'name':'zhangsan'
}
——>mobilenum=158********&age=23&name=zhangsan
然⽽应⽤没有发⽣转化,还是json结构的数据。所以获取上会有所不同。这⾥我们分成页⾯和应⽤两种请求来分别说
4.1 页⾯请求的数据获取
4.1.1 页⾯js请求如下,数据结构为json,且data为var data={}的json类型时
$.ajax({
type: "post",
data:{'mobilenum':'158********','age':'23','name':'zhangsan'},
contentType: "application/json; charset=utf-8",
url :basepath+'jijin/getList',
success: function(data){
... }
});

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。