×

apache struts怎么读

apache struts怎么读(struts2 怎样读取json数据)

admin admin 发表于2024-09-27 07:38:57 浏览3 评论0

抢沙发发表评论

其实apache struts怎么读的问题并不复杂,但是又很多的朋友都不太了解struts2 怎样读取json数据,因此呢,今天小编就来为大家分享apache struts怎么读的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!

本文目录

struts2 怎样读取json数据

一.认识JSON

JSON是一种轻量级、基于文本、与语言无关的数据交换格式,可以用文本格式的形式来存储或表示结构化的数据。

二.POST请求与Content-Type: application/json

常用的HTTP请求方法有GET, POST, PUT, DELETE等。在提交POST请求时,请求数据放在消息体(Body)中,请求数据的格式及编码方式用Content-Type来指定。如我们常用的表单《form》提交,其Content-Type默认为application/x-www-form-urlencoded,提交的数据按照key1=val1&key2=val2进行编码,服务器端也能很容易地解析K-V值。

JSON的出现,让交换的数据不再仅限于简单的K-V结构,而可以有更加复杂的层级,特别适合于RESTful接口。在发送请求时,指定Content-Type为application/json,即可使用JSON字符串作为请求的数据。而在服务器端接收到该请求后,将按照JSON字符串对请求数据进行处理。

三.Struts2接收JSON请求

在Struts2的Action中提取Content-Type为application/x-www-form-urlencoded的POST参数,我们非常熟悉:在Action中定义属性及其getter, setter方法,接收到请求时,默认会将与属性同名的参数值赋予该属性。

但是对Content-Type为application/json的请求数据,Struts2默认无法解析。因为请求的JSON数据需从输入流中读取出来,无法直接从ServletRequest的请求参数中解析。很容易想到,要读取JSON请求数据,最直接的方式就是从输入流读取。而同时,Struts2的strus2-json-plugin也提供了有关的拦截器,对JSON请求数据进行解析。下面将对两种方案进行分析:

1.从输入流中读取JSON请求数据,以下是在Action中实现的一个读取输入流数据的方法

1     //解析请求的Json数据 2     private String getRequestPostData(HttpServletRequest request) throws IOException { 3         int contentLength = request.getContentLength(); 4         if(contentLength《0){ 5             return null; 6         } 7         byte buffer; 8         for (int i = 0; i 《 contentLength;) { 9             int len = request.getInputStream().read(buffer, i, contentLength - i);10             if (len == -1) {11                 break;12             }13             i += len;14         }15         return new String(buffer, "utf-8");16     }

在Action的execute方法中调用该方法,即可获取到请求的JSON数据。

2.使用struts2-json-plugin配置

  • 添加struts2-json-plugin的依赖,以maven配置为例:

  • 《dependencies》
  •   ...   《dependency》
  •       《groupId》org.apache.struts《/groupId》
  •       《artifactId》struts2-json-plugin《/artifactId》
  •       《version》STRUTS_VERSION《/version》
  •   《/dependency》
  •   ...《/dependencies》
  • struts.xml配置文件添加JSON配置(粗体部分)

  • 《package name="example"  extends="struts-default,json-default"》
  •    ...    《interceptor-ref name="json"/》
  •    ... 《/package》
  • 在Action中指定JSON数据中各个key及getter, setter,如请求的JSON数据如下,则在Action中定义名为type, message, code的属性及其getter, setter

  • {    "type":10,    "message": "this is a test msg",    "code": 200}
  • 这样,在接收到以上JSON请求数据时,Struts会默认将type, message, code的值解析出来。

    3.struts2-json-plugin解析JSON请求数据的分析

    经过分析,struts2-json-plugin解析JSON请求数据,最核心的一个类是JSONIntercepter类。该拦截器的主要工作就是:读取JSON请求数据,将JSON数据提取出K-V值并设置到Action的属性中。步骤如下:

  • 判断当前请求数据类型是否为JSON类型

  • 1 String contentType = request.getHeader("content-type");2 ...3 if ((contentType != null) && contentType.equalsIgnoreCase("application/json")) {4     // load JSON object5     Object obj = JSONUtil.deserialize(request.getReader());6     ...7 }
  • 如果数据类型为JSON,从输入流中读取JSON数据,以下为JSONUtil类的deserialize方法

  • 1     public static Object deserialize(Reader reader) throws JSONException { 2         // read content 3         BufferedReader bufferReader = new BufferedReader(reader); 4         String line; 5         StringBuilder buffer = new StringBuilder(); 6  7         try { 8             while ((line = bufferReader.readLine()) != null) { 9                 buffer.append(line);10             }11         } catch (IOException e) {12             throw new JSONException(e);13         }14 15         return deserialize(buffer.toString());16     }
  • 解析得到JSON对象后,遍历JSON对象,取出K-V,通过反射的V设置给予K相同的属性

  • 开发者可根据自己的需求进行选择:从输入流直接读取JSON请求数据,或使用struts2-json-plugin对JSON请求数据进行处理。

如何使用Struts2框架发布webService

使用Struts2框架创建一个web工程,引入webservice所需的jar包,我用的是cxf的jar包,关于Struts2和webService的整合核心是对于StrutsPrepareAndExecuteFilter这个类的修改,使访问webservice的地址能够继续访问servlet.web.xml的修改。《filter》《filter-name》struts2《/filter-name》《filter-class》com.synjones.filter.ExtendStrutsFilter《/filter-class》《/filter《filter-mapping》《filter-name》struts2《/filter-name》《url-pattern》/*《/url-pattern》《/filter-mapping》《servlet》《servlet-name》CXF《/servlet-name》《servlet-class》org.apache.cxf.transport.servlet.CXFServlet《/servlet-class《/servlet》《servlet-mapping《servlet-name》CXF《/servlet-name》《url-pattern》/ws/*《/url-pattern》《/servlet-mapping》自定义过滤器StrutsPrepareAndExecuteFilterimport java.io.IOException;import javax.servlet.FilterChain;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;***隐藏网址***import org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter;public class ExtendStrutsFilter extends StrutsPrepareAndExecuteFilter{ public void doFilter(ServletRequest req, ServletResponse res,FilterChain chain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) req; //不过滤的url,可以自行添加if (request.getRequestURI().contains("/ws")) {//System.out.println("使用自定义的过滤器");chain.doFilter(req, res);}else{//System.out.println("使用默认的过滤器");super.doFilter(request, res, chain);}}} 其它的设置按照正常的webservice配置

Struts中如何使用

说明一下,我的环境是xp的系统,myeclipse5.1的.然后就创建一个web工程.在web-inf目录下的lib目录中添加jar包,commons-logging-1.0.4,freemarker-2.3.8,ognl-2.6.11,struts2-core-2.0.11.1,xwork-2.0.4等,这些包是什么作用,我也不太清楚,我刚接触太不到一天,这个web.xml文件中配置的好象是一个过滤器.然后把web.xml文件内容配置成如下: 《?xml version="1.0" encoding="UTF-8"?》***隐藏网址******隐藏网址******隐藏网址******隐藏网址******隐藏网址******隐藏网址******隐藏网址******隐藏网址*** 《filter》 《filter-name》struts2《/filter-name》 《filter-class》 org.apache.struts2.dispatcher.FilterDispatcher 《/filter-class》 《!-- 《init-param》《/init-param》--》 《/filter》 《filter-mapping》 《filter-name》struts2《/filter-name》 《url-pattern》/*《/url-pattern》 《/filter-mapping》 《welcome-file-list》 《welcome-file》/login.jsp《/welcome-file》 《/welcome-file-list》《/web-app》然后创建action类,在struts2中不需要actionform类,并且struts2中的action也不需要继承一个特定的action类,但一般情况他都会继承这个类com.opensymphony.xwork2.ActionSupport,然后重写他的execute()方法,该方法返回一个字符串,学过jsf的朋友应该知道的,这和jsf有点相似,刚才说他不需要actionform,其实现在的action中定义属性即可,然后给他们getter和setter方法,LoginAction代码如下: package com.struts2;import com.opensymphony.xwork2.ActionContext;import com.opensymphony.xwork2.ActionSupport;public class LoginAction extends ActionSupport ...{ /** *//** * */ private static final long serialVersionUID = 1L; private String userName; private String userPass; public String getUserName() ...{ return userName; } public void setUserName(String userName) ...{ // org.apache.struts2.dispatcher.FilterDispatcher this.userName = userName; } public String getUserPass() ...{ return userPass; } public void setUserPass(String userPass) ...{ this.userPass = userPass; } @Override public String execute() throws Exception ...{ // TODO Auto-generated method stub if ("zhangsan".equals(userName) && "lisi".equals(userPass)) ...{ ActionContext.getContext().getSession().put("user", getUserName()); return SUCCESS; } else ...{ return INPUT; } }}接着就来配置这个action,这个文件的名字叫做struts.xml有点象struts1中的struts-config.xml文件.他的存放路径我现在只知道可以放在classes下,也就是src目录下,action中配置了action路径,struts.xml代码如下: 《?xml version="1.0" encoding="UTF-8" ?》《!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"***隐藏网址***《struts》 《!-- 《constant name="struts.enable.DynamicMethodInvocation"--》 《!-- value="false" /》--》 《!-- 《constant name="struts.devMode" value="false" /》--》 《package name="struts2" extends="struts-default"》 《action name="loginAction" class="com.struts2.LoginAction"》 《result name="input"》/login.jsp《/result》 《result name="success"》/suc.jsp《/result》 《/action》 《!-- 《action name="....." class="....." method="....."》--》 《!--其中name可以随便起,这是以后自己要用到的,class就是类的全名,刚才说action不需要继承某个类, 也就是说他可以不遵循某中规范,可以在自定义的action中自定义处理方法--》 《!-- 《result》........《/result》 相当与actionforward--》 《!-- 《/action》--》 《/package》《/struts》编写jsp文件,很简单如代码: 《%...@ page language="java" import="java.util.*" pageEncoding="utf-8"%》《%...@ taglib prefix="s" uri="/struts-tags"%》《!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"》《html》 《head》 《title》My JSP ’login.jsp’ starting page《/title》***隐藏网址******隐藏网址******隐藏网址******隐藏网址******隐藏网址*** 《!-- 《link rel="stylesheet" type="text/css" href="styles.css"》 --》 《/head》 《body》 《s:form action="loginAction"》 《%...-- 《form action="LoginAction.action" method="post"》--%》 《s:textfield name="userName" label="用户名"》《/s:textfield》 《br》 《s:password name="userPass" label="密 码"》《/s:password》 《br》 《s:submit》《/s:submit》 《%...-- 《/form》--%》 《/s:form》 《br》 《/body》《/html》suc.jsp文件如下: 《%...@ page language="java" import="java.util.*" pageEncoding="utf-8"%》《jsp:directive.page import="com.struts2.LoginAction" /》《%...@ taglib prefix="s" uri="/struts-tags"%》《!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"》《html》 《head》 《title》My JSP ’suc.jsp’ starting page《/title》***隐藏网址******隐藏网址******隐藏网址******隐藏网址******隐藏网址*** 《!-- 《link rel="stylesheet" type="text/css" href="styles.css"》 --》 《/head》 《body》 ${sessionScope.user },欢迎登陆。。。。。 《br》 《/body》《/html》

struts资源文件验证表单代码

    一  form表单必须要实现继承validateForm 并且不能实现validate方法 不然会默认使用validate方法验证         package jinchun struts form;        import javax servlet HttpServletRequest;        import apache struts action ActionErrors;        import apache struts action ActionMapping;        import apache struts validator ValidatorForm;        public class LoginForm extends ValidatorForm {        private String sex;        public void reset(ActionMapping mapping HttpServletRequest request) {        }        public String getSex() {        return sex;        }        public void setSex(String sex) {        this sex = sex;        }        }        }        二         使用validator_rules xml新建validation xml文件作为验证规则文件        《!DOCTYPE form validation PUBLIC        //Apache Sofare Foundation//DTD Commons Validator Rules Configuration //EN         _ _ _ dtd 》        《form validation》        《formset》//里面可以验证多个表单        《form name= loginForm 》//验证loginForm表单 这个表单名称和//nfig xml文件中的表单名称相对应         《field property= uname depends= required mask 》//验证必填和规则两项        《arg key= namelab /》        《var》        《var name》mask《/var name》        《var value》《/var value》        《/var》        《/field》        《field property= age depends= required intRange 》//验证必填和范围 项        《arg key= agelab /》        《arg name= intRange key= ${var:min} resource= false /》        《arg name= intRange key= ${var:max} resource= false /》        《var》        《var name》min《/var name》        《var value》 《/var value》        《/var》        《var》        《var name》max《/var name》        《var value》 《/var value》        《/var》        《/field》        《/form》        《/formset》        《/form validation》        三 资源文件里面如下        ApplicationResources properties        # Resources for parameter jinchun struts ApplicationResources         # Project struts_validate        namelab=姓名        errors required=《font size=   color=red》{ }是必须填的《/font》//对应必填        errors range=《font size= color=red》{ }是必须在{ }和{ }之间的《/font》//对//应范围        agelab=年龄        errors invalid=《font size=   color=red》{ }是无效的《/font》//对应mask        sexlab=性别        tellab=电话        emaillabe=email地址        四 struts config xml文件中        《message resources        parameter= jinchun struts ApplicationResources /》        《plug in className= apache struts validator ValidatorPlugIn 》        《set property property= pathnames         value= /WEB INF/validator rules xml         /WEB INF/validation xml /》        《/plug in》//这句话是从validator rules xml中复制的        《/struts config》 lishixinzhi/Article/program/Java/ky/201311/27908

struts 怎么读

struts 生词本简明释义n.(框架的)支杆( strut的名词复数 );支柱;趾高气扬的步态;(尤指跳舞或表演时)卖弄v.趾高气扬地走,高视阔步( strut的第三人称单数 )易混淆的单词:STRUTS以下结果由 金山词霸 提供柯林斯高阶英汉词典 网络释义 百科释义1.VERB趾高气扬地走;昂首阔步Someone who struts walks in a proud way, with their head held high and their chest out, as if they are very important. He struts around town like he owns the place.

关于apache struts怎么读和struts2 怎样读取json数据的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。