- 浏览: 57623 次
- 性别:
- 来自: 成都
-
文章分类
最新评论
-
chiqinghaichi:
楼主好!菜鸟一枚,试了下你的程序,当访问 http://loc ...
SpringMVC -
随意而生:
复习复习 不错
SpringMVC -
ccii:
cylboke 写道他的意思是“orcle”写错了吧?我猜的! ...
Oracle基本操作 -
happy200318:
给个赞,不错
SpringMVC -
cylboke:
他的意思是“orcle”写错了吧?我猜的!!!
Oracle基本操作
一、Struts2概述
Struts2 是Apache软件基金会(ASF)赞助的一个开源项目,使用Struts2的目的是为了帮助我们减少在运用MVC设计模型来开发Web应用的时间。如果我们想混合使用Servlets和JSP的优点来建立可扩展的应用,Struts2是一个不错的选择。
二、Struts2工作原理
如图,Struts2工作原理大概分为以下几个步骤:
1.客户端初始化一个指向Servlet容器(例如Tomcat)的请求。
2.这个请求经过一系列的过滤器(Filter)(ActionContextCleanUp,SiteMesh,etc等)。
3.接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请求调用那个Action。
4.FilterDispatcher将控制权委派给ActionProxy,ActionProxy通过Configuration Manager读取框架的配置文件,然后创建一个ActionInvocation实例。
5.ActionInvocation调用Action,Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。
三、Struts2相对于Struts1的改进
1.在Action的实现方面
Struts1要求必须统一扩展自Action类,而Struts2中可以是一个普通的POJO。
2.线程模型方面
Struts1的Action是单实例的,一个Action的实例处理所有的请求。Struts2的Action是一个请求对应一个实例(每次请求时都新new出一个对象),没有线程安全方面的问题。
3.Servlet依赖方面
Struts1的Action依赖于Servlet API,比如Action的execute方法的参数就包括request和response对象。这使程序难于测试。Struts2中的Action不再依赖于Servlet API,有利于测试,并且实现TDD。
4.封装请求参数
Struts1中强制使用ActionForm对象封装请求的参数。Struts2可以选择使用POJO类来封装请求的参数,或者直接使用Action的属性。
5.表达式语言方面
Struts1中整合了EL,但是EL对集合和索引的支持不强,Struts2整合了OGNL(Object Graph NavigationLanguage)。绑定值到视图技术
Struts1使用标准的JSP,Struts2使用“ValueStack”技术。
6.类型转换
Struts1中的ActionForm基本使用String类型的属性。Struts2中使用OGNL进行转换,可以更方便的使用。Struts1中支持覆盖validate方法或者使用Validator框架。Struts2支持重写validate方法或者使用XWork的验证框架。
7.Action执行控制的对比
Struts1支持每一个模块对应一个请求处理,但是模块中的所有Action必须共享相同的生命周期。Struts2支持通过拦截器堆栈为每一个Action创建不同的生命周期。
四、Struts2开发示例
1. Struts2的下载
官方下载地址:http://struts.apache.org/download.cgi
Struts2完整版结构如下:apps(应用示例),docs(帮助文档,API),lib(核心类库),src(全部源码)
2. 导入struts2核心类库到项目
基本包包括:antlr-2.7.2.jar,commons-fileupload-1.3.jar,commons-io-2.0.1.jar,commons-logging-1.1.3.jar,commons-lang3-3.1.jar,freemarker-2.3.19.jar,javassist-3.11.0.GA.jar,ognl-3.0.6.jar,struts2-core-2.3.15.3.jar,
xwork-core-2.3.15.3.jar,如需使用Struts2的更多特性,则需导入其它jar包
3. 在web.xml中配置Struts2的核心Filter
<!-- 定义Struts2的核心Filter -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<!-- 让Struts2的核心Filter拦截所有请求 -->
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
4. 创建登陆页面login.jsp,测试Struts2
<script type="text/javascript">
function regist(){
//获取页面的第一个表单
targetForm = document.forms[0];
//动态修改表单的action属性
targetForm.action = "regist";
}
</script>
<body bgcolor="pink">
<center>
用户登陆<br><hr>
<form action="login">
账 号:<input type="text" name="username"><br>
密 码:<input type="text" name="password"><br>
<input type="submit" value="登陆">
<input type="submit" value="注册" onclick="regist();">
</form>
</center>
</body>
5. 为Struts2添加配置文件struts.xml
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
"http://struts.apache.org/dtds/struts-2.1.7.dtd">
<!-- 指定Struts 2配置文件的根元素 -->
<struts>
<!-- 指定全局国际化资源文件 -->
<constant name="struts.custom.i18n.resources" value="mess"/>
<!-- 指定国际化编码所使用的字符集 -->
<constant name="struts.i18n.encoding" value="GBK"/>
<!-- 所有的Action定义都应该放在package下 -->
<package name="userManager" extends="struts-default">
<!-- 不配置method属性,交给默认的execute()方法处理 -->
<action name="login" class="test.action.LoginAction">
<!-- 定义三个逻辑视图和物理资源之间的映射 -->
<result name="input">/login.jsp</result>
<result name="error">/error.jsp</result>
<result name="success">/welcome.jsp</result>
</action>
<!-- 配置method属性,交给regist()方法处理 -->
<action name="regist" class="test.action.LoginAction" method="regist">
<result name="success">/welcome.jsp</result>
</action>
</package>
<!-- 导入其它完整的配置文件 -->
<include file="struts-xxx.xml"></include>
</struts>
6. 编写Action处理类BaseAction.java,LoginAction.java
/////////////////// 1.BaseAction
///////////////// 2. LoginAction
7. 其它跳转页面welcome.jsp
<body>
登陆成功!<%=request.getAttribute("username")%><br>
<a href="login.jsp">退出</a><hr>
</body>
五、Struts2的文件上传和下载
Struts2的文件上传:
1. 测试文件上传页面upload.jsp
此处使用Struts2标签来生成上传文件的表单,为了让浏览器采用二进制数据的方式把数据发送到服务器,我们必须把表单的method设置为POST,将enctype设置为multipart/form-data。jsp代码如下:
<body>
<s:form action="uploadPro" method="post" enctype="multipart/form-data">
<s:file name="upload" label="选择文件"/><br />
<s:submit value="上传"/>
</s:form>
</body>
2. 实现文件上传的Action(UploadAction.java)
Action实现类其实非常简单,只需要定义三个属性接收文件参数即可,一是类型为File的xxx封装文件内容,二是String类型的xxxFileName封装文件名,三是String类型的xxxContentType封装文件类型。代码如下:
3. 配置文件上传的Action(struts.xml)
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
"http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
<constant name="struts.custom.i18n.resources" value="mess"/>
<!-- 设置该应用使用的解码集 -->
<constant name="struts.i18n.encoding" value="GBK"/>
<package name="lee" extends="struts-default">
<!-- 配置处理文件上传的Action -->
<action name="uploadPro" class="test.UploadAction">
<!-- 配置Struts 2默认的视图页面 -->
<result>/upload.jsp</result>
</action>
</package>
</struts>
4. 实现文件过滤
方法一:直接在Action中判断文件的类型是否为允许类型
方法二:拦截器实现文件过滤,如下:
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
"http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
<constant name="struts.custom.i18n.resources" value="mess"/>
<!-- 设置该应用使用的解码集 -->
<constant name="struts.i18n.encoding" value="GBK"/>
<package name="lee" extends="struts-default">
<!-- 配置处理文件上传的Action -->
<action name="uploadPro" class="org.crazyit.app.action.UploadAction">
<!-- 配置fileUpload的拦截器 -->
<interceptor-ref name="fileUpload">
<!-- 配置允许上传的文件类型 -->
<param name="allowedTypes">image/png,image/gif,image/jpeg</param>
<!-- 配置允许上传的文件大小 -->
<param name="maximumSize">2000</param>
</interceptor-ref>
<!-- 配置系统默认的拦截器 -->
<interceptor-ref name="defaultStack"/>
<!-- 配置Struts 2默认的视图页面 -->
<result>/WEB-INF/content/succ.jsp</result>
</action>
</package>
</struts>
Struts2的文件下载:
1. 测试文件下载jsp页面
<body>
<ul><li>下载:<a href="download.action">下载文件</a></li></ul>
</body>
2. 实现文件下载的Action(FileDownloadAction.java)
3. 配置文件下载的Action(struts.xml)
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
"http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
<constant name="struts.custom.i18n.resources" value="mess"/>
<constant name="struts.i18n.encoding" value="GBK"/>
<package name="lee" extends="struts-default">
<action name="download" class="test.FileDownloadAction">
<param name="inputPath">\images\aaa.jpg</param>
<!-- 配置结果类型为stream的结果 -->
<result name="success" type="stream">
<!-- 指定下载文件的文件类型 -->
<param name="contentType">image/jpg</param>
<!-- 指定由getTargetFile()方法返回被下载文件的InputStream -->
<param name="inputName">targetFile</param>
<param name="contentDisposition">filename="hap.jpg"</param>
<!-- 指定下载文件的缓冲大小 -->
<param name="bufferSize">4096</param>
</result>
</action>
</package>
</struts>
六、Struts2返回JSON数据示例
1. 导包
除导入Struts2基本包以外还要导入struts2-json-plugin-2.3.15.3.jar
2. 实现Action(JSONExample.java)
3. 配置Action(struts.xml)
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
"http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
<constant name="struts.i18n.encoding" value="UTF-8"/>
<package name="example" extends="json-default">
<action name="JSONExample" class="test.JSONExample">
<!-- 配置类型的json的Result -->
<result type="json">
<!-- 为该Result指定参数 -->
<param name="noCache">true</param>
<param name="contentType">text/html</param>
<!-- 设置只返回Action的map属性 -->
<!-- param name="root">map</param -->
</result>
</action>
</package>
</struts>
4. 测试返回结果
浏览器输入: http://localhost:8080/TestStrutsJSON/example/JSONExample(项目路径+Action配置文件包名+Action名)测试得到的JSON数据。
Struts2 是Apache软件基金会(ASF)赞助的一个开源项目,使用Struts2的目的是为了帮助我们减少在运用MVC设计模型来开发Web应用的时间。如果我们想混合使用Servlets和JSP的优点来建立可扩展的应用,Struts2是一个不错的选择。
二、Struts2工作原理

如图,Struts2工作原理大概分为以下几个步骤:
1.客户端初始化一个指向Servlet容器(例如Tomcat)的请求。
2.这个请求经过一系列的过滤器(Filter)(ActionContextCleanUp,SiteMesh,etc等)。
3.接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请求调用那个Action。
4.FilterDispatcher将控制权委派给ActionProxy,ActionProxy通过Configuration Manager读取框架的配置文件,然后创建一个ActionInvocation实例。
5.ActionInvocation调用Action,Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。
三、Struts2相对于Struts1的改进
1.在Action的实现方面
Struts1要求必须统一扩展自Action类,而Struts2中可以是一个普通的POJO。
2.线程模型方面
Struts1的Action是单实例的,一个Action的实例处理所有的请求。Struts2的Action是一个请求对应一个实例(每次请求时都新new出一个对象),没有线程安全方面的问题。
3.Servlet依赖方面
Struts1的Action依赖于Servlet API,比如Action的execute方法的参数就包括request和response对象。这使程序难于测试。Struts2中的Action不再依赖于Servlet API,有利于测试,并且实现TDD。
4.封装请求参数
Struts1中强制使用ActionForm对象封装请求的参数。Struts2可以选择使用POJO类来封装请求的参数,或者直接使用Action的属性。
5.表达式语言方面
Struts1中整合了EL,但是EL对集合和索引的支持不强,Struts2整合了OGNL(Object Graph NavigationLanguage)。绑定值到视图技术
Struts1使用标准的JSP,Struts2使用“ValueStack”技术。
6.类型转换
Struts1中的ActionForm基本使用String类型的属性。Struts2中使用OGNL进行转换,可以更方便的使用。Struts1中支持覆盖validate方法或者使用Validator框架。Struts2支持重写validate方法或者使用XWork的验证框架。
7.Action执行控制的对比
Struts1支持每一个模块对应一个请求处理,但是模块中的所有Action必须共享相同的生命周期。Struts2支持通过拦截器堆栈为每一个Action创建不同的生命周期。
四、Struts2开发示例
1. Struts2的下载
官方下载地址:http://struts.apache.org/download.cgi
Struts2完整版结构如下:apps(应用示例),docs(帮助文档,API),lib(核心类库),src(全部源码)
2. 导入struts2核心类库到项目
基本包包括:antlr-2.7.2.jar,commons-fileupload-1.3.jar,commons-io-2.0.1.jar,commons-logging-1.1.3.jar,commons-lang3-3.1.jar,freemarker-2.3.19.jar,javassist-3.11.0.GA.jar,ognl-3.0.6.jar,struts2-core-2.3.15.3.jar,
xwork-core-2.3.15.3.jar,如需使用Struts2的更多特性,则需导入其它jar包
3. 在web.xml中配置Struts2的核心Filter
<!-- 定义Struts2的核心Filter -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<!-- 让Struts2的核心Filter拦截所有请求 -->
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
4. 创建登陆页面login.jsp,测试Struts2
<script type="text/javascript">
function regist(){
//获取页面的第一个表单
targetForm = document.forms[0];
//动态修改表单的action属性
targetForm.action = "regist";
}
</script>
<body bgcolor="pink">
<center>
用户登陆<br><hr>
<form action="login">
账 号:<input type="text" name="username"><br>
密 码:<input type="text" name="password"><br>
<input type="submit" value="登陆">
<input type="submit" value="注册" onclick="regist();">
</form>
</center>
</body>
5. 为Struts2添加配置文件struts.xml
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
"http://struts.apache.org/dtds/struts-2.1.7.dtd">
<!-- 指定Struts 2配置文件的根元素 -->
<struts>
<!-- 指定全局国际化资源文件 -->
<constant name="struts.custom.i18n.resources" value="mess"/>
<!-- 指定国际化编码所使用的字符集 -->
<constant name="struts.i18n.encoding" value="GBK"/>
<!-- 所有的Action定义都应该放在package下 -->
<package name="userManager" extends="struts-default">
<!-- 不配置method属性,交给默认的execute()方法处理 -->
<action name="login" class="test.action.LoginAction">
<!-- 定义三个逻辑视图和物理资源之间的映射 -->
<result name="input">/login.jsp</result>
<result name="error">/error.jsp</result>
<result name="success">/welcome.jsp</result>
</action>
<!-- 配置method属性,交给regist()方法处理 -->
<action name="regist" class="test.action.LoginAction" method="regist">
<result name="success">/welcome.jsp</result>
</action>
</package>
<!-- 导入其它完整的配置文件 -->
<include file="struts-xxx.xml"></include>
</struts>
6. 编写Action处理类BaseAction.java,LoginAction.java
/////////////////// 1.BaseAction
package test.action; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; public class BaseAction extends ActionSupport { private transient HttpServletRequest request = null; private transient HttpServletResponse response = null; private transient ServletContext servletContext = null; private transient HttpSession session = null; public void setRequest(HttpServletRequest request) { this.request = request; } public void setResponse(HttpServletResponse response) { this.response = response; } public void setServletContext(ServletContext servletContext) { this.servletContext = servletContext; } public void setSession(HttpSession session) { this.session = session; } public HttpServletRequest getRequest(){ if(request != null){ return request; } return ServletActionContext.getRequest(); } public HttpServletResponse getResponse(){ if(response != null){ return response; } return ServletActionContext.getResponse(); } public ServletContext getServletContext(){ if(servletContext != null){ return servletContext; } return ServletActionContext.getServletContext(); } public HttpSession getSession(){ if(session != null){ return session; } return getRequest().getSession(); } }
///////////////// 2. LoginAction
package test.action; public class LoginAction extends BaseAction{ //定义封装请求参数的username和password属性 private String username; private String password; public String getUsername(){ return username; } public void setUsername(String username){ this.username = username; } public String getPassword(){ return password; } public void setPassword(String password){ this.password = password; } //注册Action public String regist() throws Exception { System.out.println(this.getRequest().getAttribute("username")); this.getRequest().setAttribute("username", "regist"); return SUCCESS; } //默认的登陆Action public String execute() throws Exception { // 1. 通过request对象得到表单的值 System.out.println(this.getRequest().getParameter("username")); // 2. 直接通过getter和setter得到表单的值 if (getUsername().equals("a")&& getPassword().equals("a")){ // 3. 设置、得到session的值 this.getSession().setAttribute("username", "ok"); System.out.println(this.getSession().getAttribute("username")); // 4. 设置响应的字符串 this.getResponse().setCharacterEncoding("UTF-8"); this.getResponse().getWriter().print("ccccc"); return SUCCESS; } else { return ERROR; } } }
7. 其它跳转页面welcome.jsp
<body>
登陆成功!<%=request.getAttribute("username")%><br>
<a href="login.jsp">退出</a><hr>
</body>
五、Struts2的文件上传和下载
Struts2的文件上传:
1. 测试文件上传页面upload.jsp
此处使用Struts2标签来生成上传文件的表单,为了让浏览器采用二进制数据的方式把数据发送到服务器,我们必须把表单的method设置为POST,将enctype设置为multipart/form-data。jsp代码如下:
<body>
<s:form action="uploadPro" method="post" enctype="multipart/form-data">
<s:file name="upload" label="选择文件"/><br />
<s:submit value="上传"/>
</s:form>
</body>
2. 实现文件上传的Action(UploadAction.java)
Action实现类其实非常简单,只需要定义三个属性接收文件参数即可,一是类型为File的xxx封装文件内容,二是String类型的xxxFileName封装文件名,三是String类型的xxxContentType封装文件类型。代码如下:
package test; import com.opensymphony.xwork2.ActionSupport; import java.io.*; public class UploadAction extends ActionSupport{ //封装上传文件域 private File upload; //封装上传文件类型 private String uploadContentType; //封装上传文件名 private String uploadFileName; public void setUpload(File upload) { this.upload = upload; } public File getUpload(){ return (this.upload); } public void setUploadContentType(String uploadContentType){ this.uploadContentType = uploadContentType; } public String getUploadContentType(){ return (this.uploadContentType); } public void setUploadFileName(String uploadFileName){ this.uploadFileName = uploadFileName; } public String getUploadFileName(){ return (this.uploadFileName); } @Override public String execute() throws Exception{ //将文件写入服务器,没有此文件时新建 File file = new File("h:\\AAA\\"+getUploadFileName()); FileOutputStream fos = new FileOutputStream(file); FileInputStream fis = new FileInputStream(getUpload()); byte[] buffer = new byte[1024]; int len = 0; while ((len = fis.read(buffer)) > 0){ fos.write(buffer , 0 , len); } fos.close(); return SUCCESS; } }
3. 配置文件上传的Action(struts.xml)
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
"http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
<constant name="struts.custom.i18n.resources" value="mess"/>
<!-- 设置该应用使用的解码集 -->
<constant name="struts.i18n.encoding" value="GBK"/>
<package name="lee" extends="struts-default">
<!-- 配置处理文件上传的Action -->
<action name="uploadPro" class="test.UploadAction">
<!-- 配置Struts 2默认的视图页面 -->
<result>/upload.jsp</result>
</action>
</package>
</struts>
4. 实现文件过滤
方法一:直接在Action中判断文件的类型是否为允许类型
方法二:拦截器实现文件过滤,如下:
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
"http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
<constant name="struts.custom.i18n.resources" value="mess"/>
<!-- 设置该应用使用的解码集 -->
<constant name="struts.i18n.encoding" value="GBK"/>
<package name="lee" extends="struts-default">
<!-- 配置处理文件上传的Action -->
<action name="uploadPro" class="org.crazyit.app.action.UploadAction">
<!-- 配置fileUpload的拦截器 -->
<interceptor-ref name="fileUpload">
<!-- 配置允许上传的文件类型 -->
<param name="allowedTypes">image/png,image/gif,image/jpeg</param>
<!-- 配置允许上传的文件大小 -->
<param name="maximumSize">2000</param>
</interceptor-ref>
<!-- 配置系统默认的拦截器 -->
<interceptor-ref name="defaultStack"/>
<!-- 配置Struts 2默认的视图页面 -->
<result>/WEB-INF/content/succ.jsp</result>
</action>
</package>
</struts>
Struts2的文件下载:
1. 测试文件下载jsp页面
<body>
<ul><li>下载:<a href="download.action">下载文件</a></li></ul>
</body>
2. 实现文件下载的Action(FileDownloadAction.java)
package test; import java.io.InputStream; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.*; public class FileDownloadAction extends ActionSupport { //该属性可以在配置文件中动态指定该属性值 private String inputPath; //依赖注入该属性值的setter方法 public void setInputPath(String value){ inputPath = value; } /* * 定义一个返回InputStream的方法,该方法将作为被下载文件的入口, * 且需要配置stream类型结果时指定inputName参数,inputName参数的值就是方法去掉get前缀、首字母小写的字符串 */ public InputStream getTargetFile() throws Exception { //ServletContext提供getResourceAsStream()方法返回指定文件对应的输入流 return ServletActionContext.getServletContext().getResourceAsStream(inputPath); } }
3. 配置文件下载的Action(struts.xml)
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
"http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
<constant name="struts.custom.i18n.resources" value="mess"/>
<constant name="struts.i18n.encoding" value="GBK"/>
<package name="lee" extends="struts-default">
<action name="download" class="test.FileDownloadAction">
<param name="inputPath">\images\aaa.jpg</param>
<!-- 配置结果类型为stream的结果 -->
<result name="success" type="stream">
<!-- 指定下载文件的文件类型 -->
<param name="contentType">image/jpg</param>
<!-- 指定由getTargetFile()方法返回被下载文件的InputStream -->
<param name="inputName">targetFile</param>
<param name="contentDisposition">filename="hap.jpg"</param>
<!-- 指定下载文件的缓冲大小 -->
<param name="bufferSize">4096</param>
</result>
</action>
</package>
</struts>
六、Struts2返回JSON数据示例
1. 导包
除导入Struts2基本包以外还要导入struts2-json-plugin-2.3.15.3.jar
2. 实现Action(JSONExample.java)
package test; import java.util.HashMap; import java.util.Map; import com.opensymphony.xwork2.Action; import org.apache.struts2.json.annotations.JSON; public class JSONExample{ //模拟处理结果的属性 private int[] ints = {10, 20}; private Map<String , String> map = new HashMap<String , String>(); private String customName = "顾客"; //封装请求参数的三个属性 private String field1; //'transient'修饰的属性不会被序列化 private transient String field2; //没有setter和getter方法的字段不会被序列化 private String field3; public String execute(){ field2 = "333"; map.put("name", "疯狂Java讲义"); return Action.SUCCESS; } //使用注释语法来改变该属性序列化后的属性名 @JSON(name="newName") public Map getMap(){ return this.map; } //customName属性的setter和getter方法 public void setCustomName(String customName){ this.customName = customName; } public String getCustomName(){ return this.customName; } //field1属性的setter和getter方法 public void setField1(String field1){ this.field1 = field1; } public String getField1(){ return this.field1; } //field2属性的setter和getter方法 public void setField2(String field2){ this.field2 = field2; } public String getField2(){ return this.field2; } //field3属性的setter和getter方法 public void setField3(String field3){ this.field3 = field3; } public String getField3(){ return this.field3; } }
3. 配置Action(struts.xml)
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
"http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
<constant name="struts.i18n.encoding" value="UTF-8"/>
<package name="example" extends="json-default">
<action name="JSONExample" class="test.JSONExample">
<!-- 配置类型的json的Result -->
<result type="json">
<!-- 为该Result指定参数 -->
<param name="noCache">true</param>
<param name="contentType">text/html</param>
<!-- 设置只返回Action的map属性 -->
<!-- param name="root">map</param -->
</result>
</action>
</package>
</struts>
4. 测试返回结果
浏览器输入: http://localhost:8080/TestStrutsJSON/example/JSONExample(项目路径+Action配置文件包名+Action名)测试得到的JSON数据。
发表评论
-
Dubbo
2015-02-25 17:36 2256一. Dubbo概述 Dubbo是Alibaba开源的 ... -
MyBatis
2014-05-16 00:24 2601一、MyBatis简介 1. MyBatis ... -
Log4j
2014-04-20 01:20 924一、Log4j基础 1. Log4j简介 Log4j是Ap ... -
ActiveMQ
2014-04-14 00:05 2044一、JMS 1. JMS简介 JMS即Java消息服务(J ... -
Maven
2014-04-06 00:57 577一、Maven 简介 1. 作为Apache组织中的一个颇为成 ...
相关推荐
1、文件内容:ibus-table-chinese-erbi-1.4.6-3.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/ibus-table-chinese-erbi-1.4.6-3.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、更多资源/技术支持:公众号禅静编程坊
选择Java后台技术和MySQL数据库,在前台界面为提升用户体验,使用Jquery、Ajax、CSS等技术进行布局。 系统包括两类用户:学生、管理员。 学生用户只要实现了前台信息的查看,打开首页,查看网站介绍、自习室信息、在线留言、轮播图信息公告等,通过点击首页的菜单跳转到对应的功能页面菜单,包括网站首页、自习室信息、注册登录、个人中心、后台登录。 学生用户通过账户账号登录,登录后具有所有的操作权限,如果没有登录,不能在线预约。学生用户退出系统将注销个人的登录信息。 管理员通过后台的登录页面,选择管理员权限后进行登录,管理员的权限包括轮播公告管理、老师学生信息管理和信息审核管理,管理员管理后点击退出,注销登录信息。 管理员用户具有在线交流的管理,自习室信息管理、自习室预约管理。 在线交流是对前台用户留言内容进行管理,删除留言信息,查看留言信息。
面向基层就业个性化大学生服务平台(源码+数据库+论文+ppt)java开发springboot框架javaweb,可做计算机毕业设计或课程设计 【功能需求】 面向基层就业个性化大学生服务平台(源码+数据库+论文+ppt)java开发springboot框架javaweb,可做计算机毕业设计或课程设计 面向基层就业个性化大学生服务平台中的管理员角色主要负责了如下功能操作。 (1)职业分类管理功能需求:对职业进行划分分类管理等。 (2)用户管理功能需求:对用户信息进行维护管理等。 (3)职业信息管理功能需求:对职业信息进行发布等。 (4)问卷信息管理功能需求:可以发布学生的问卷调查操作。 (5)个性化测试管理功能需求:可以发布个性化测试试题。 (6)试题管理功能需求:对测试试题进行增删改查操作。 (7)社区交流管理功能需求:对用户的交流论坛信息进行维护管理。 面向基层就业个性化大学生服务平台中的用户角色主要负责了如下功能操作。 (1)注册登录功能需求:没有账号的用户,可以输入账号,密码,昵称,邮箱等信息进行注册操作,注册后可以输入账号和密码进行登录。 (2)职业信息功能需求:用户可以对职业信息进行查看。 (3)问卷信息功能需求:可以在线进行问卷调查答卷操作。 (4)社区交流功能需求:可以在线进行社区交流。 (5)个性化测试功能需求:可以在线进行个性化测试。 (6)公告资讯功能需求:可以查看浏览系统发布的公告资讯信息。 【环境需要】 1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境:IDEA,Eclipse,Myeclipse都可以。 3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可 4.数据库:MySql 5.7/8.0等版本均可; 【购买须知】 本源码项目经过严格的调试,项目已确保无误,可直接用于课程实训或毕业设计提交。里面都有配套的运行环境软件,讲解视频,部署视频教程,一应俱全,可以自己按照教程导入运行。附有论文参考,使学习者能够快速掌握系统设计和实现的核心技术。
三菱Fx3u程序:自动检测包装机电机控制模板,PLC脉冲与伺服定位,手自动切换功能,三菱Fx3u程序:自动检测包装机电机控制模板——涵盖伺服定位与手自动切换功能,三菱Fx3u程序,自动检测包装机。 该程序六个电机,plc本体脉冲控制3个轴,3个1pg控制。 程序内包括伺服定位,手自动切,功能快的使用,可作为模板程序,很适合新手。 ,三菱Fx3u程序; 自动检测包装机; 六个电机; PLC脉冲控制; 伺服定位; 手自动切换; 功能快捷键; 模板程序。,三菱Fx3u PLC控制下的自动包装机程序:六电机伺服定位与手自动切换模板程序
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
计及信息间隙决策与多能转换的综合能源系统优化调度模型:实现碳经济最大化与源荷不确定性考量,基于信息间隙决策与多能转换的综合能源系统优化调度模型:源荷不确定性下的高效碳经济调度策略,计及信息间隙决策及多能转的综合能源系统优化调度 本代码构建了含风电、光伏、光热发电系统、燃气轮机、燃气锅炉、电锅炉、储气、储电、储碳、碳捕集装置的综合能源系统优化调度模型,并考虑P2G装置与碳捕集装置联合运行,从而实现碳经济的最大化,最重要的是本文引入了信息间隙决策理论考虑了源荷的不确定性(本代码的重点)与店铺的47代码形成鲜明的对比,注意擦亮眼睛,认准原创,该代码非常适合修改创新,,提供相关的模型资料 ,计及信息间隙决策; 综合能源系统; 优化调度; 多能转换; 碳经济最大化; 风电; 光伏; 燃气轮机; 储气; 储电; 储碳; 碳捕集装置; P2G装置联合运行; 模型资料,综合能源系统优化调度模型:基于信息间隙决策和多能转换的原创方案
IPG QCW激光模块电源驱动电路设计与实现:包含安全回路、紧急放电回路及光纤互锁功能的多版本原理图解析,IPG QCW激光模块电源驱动电路设计与实现:含安全回路、紧急放电及光纤互锁等多重保护功能的原理图解析,IPG QCW激光模块电源驱动电路, 包含安全回路,紧急放电回路,光纤互锁回路等, 元件参数请根据实际设计适当调整,此电路仅供参考,不提供pcb文件 原理图提供PDF和KICAD两个版本。 ,IPG激光模块; QCW激光电源驱动; 安全回路; 紧急放电回路; 光纤互锁回路; 原理图PDF和KICAD版本。,IPG激光模块电源驱动电路图解:含安全与紧急放电回路
基于LSSVM的短期电力负荷预测模型及其性能评估:结果揭露精确度与误差分析,LSSVM在短期电力负荷预测中的结果分析:基于均方根误差、平均绝对误差及平均相对百分误差的评估。,LSSVM最小二乘支持向量机做短期电力负荷预测。 结果分析 均方根误差(RMSE):0.79172 平均绝对误差(MAE):0.4871 平均相对百分误差(MAPE):13.079% ,LSSVM(最小二乘支持向量机);短期电力负荷预测;均方根误差(RMSE);平均绝对误差(MAE);平均相对百分误差(MAPE),LSSVM在电力负荷短期预测中的应用及性能分析
1、文件内容:libmtp-examples-1.1.14-1.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/libmtp-examples-1.1.14-1.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、更多资源/技术支持:公众号禅静编程坊
资源内项目源码是均来自个人的课程设计、毕业设计或者具体项目,代码都测试ok,都是运行成功后才上传资源,答辩评审绝对信服的,拿来就能用。放心下载使用!源码、说明、论文、数据集一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 4、如有侵权请私信博主,感谢支持
2023-04-06-项目笔记-第四百一十六阶段-课前小分享_小分享1.坚持提交gitee 小分享2.作业中提交代码 小分享3.写代码注意代码风格 4.3.1变量的使用 4.4变量的作用域与生命周期 4.4.1局部变量的作用域 4.4.2全局变量的作用域 4.4.2.1全局变量的作用域_1 4.4.2.414局变量的作用域_414- 2025-02-21
MINIST数据集和春风机器学习框架
1、文件内容:ibus-table-chinese-wu-1.4.6-3.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/ibus-table-chinese-wu-1.4.6-3.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、更多资源/技术支持:公众号禅静编程坊
宿舍管理系统(源码+数据库+论文+ppt)java开发springboot框架javaweb,可做计算机毕业设计或课程设计 【功能需求】 系统拥有管理员和学生两个角色,主要具备系统首页、个人中心、学生管理、宿舍信息管理、宿舍分配管理、水电费管理、进入宿舍管理、出入宿舍管理、维修信息管理、卫生信息管理、考勤信息管理、留言板、交流论坛、系统管理等功能模块。 【环境需要】 1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境:IDEA,Eclipse,Myeclipse都可以。 3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可 4.数据库:MySql 5.7/8.0等版本均可; 【购买须知】 本源码项目经过严格的调试,项目已确保无误,可直接用于课程实训或毕业设计提交。里面都有配套的运行环境软件,讲解视频,部署视频教程,一应俱全,可以自己按照教程导入运行。附有论文参考,使学习者能够快速掌握系统设计和实现的核心技术。
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
人凤飞飞凤飞飞是粉色丰富
2024蓝桥杯嵌入式学习资料
image_download_1740129191509.jpg
基于Multisim仿真的带优先病房呼叫系统设计(仿真图) 设计一个病房呼叫系统。 功能 (1)当有病人紧急呼叫时,产生声,光提示,并显示病人的编号; (2)根据病人的病情设计优先级别,当有多人呼叫时,病情严重者优先; (3)医护人员处理完当前最高级别的呼叫后,系统按优先级别显示其他呼叫病人的病号。
基于STM32F103的3.6kW全桥逆变器资料:并网充电放电、智能切换与全方位保护方案,基于STM32F103的3.6kW全桥逆变器资料:并网充电放电、智能控制与全方位保护方案,逆变器光伏逆变器,3.6kw储能逆变器全套资料 STM32储能逆变器 BOOST 全桥 基于STM32F103设计,具有并网充电、放电;并网离网自动切;485通讯,在线升级;风扇智能控制,提供过流、过压、短路、过温等全方位保护。 基于arm的方案区别于dsp。 有PCB、原理图及代码ad文件。 ,逆变器; 储能逆变器; STM32F103; 3.6kw; 485通讯; 全方位保护; 智能控制; 方案区别; PCB文件; 原理图文件; ad文件。,基于STM32F103的3.6kw储能逆变器:全方位保护与智能控制