一、说明

类型转换、输入验证(前台和后台)(validate()、validateXXX()、xml)

标签、上传下载、i18n(国际化)、ognl(#reqeust.name)

注解方式、log4j(日志记录)、jfreechart(java图形报表)、highcharts(jquery插件)

二、上传下载

1、上传

在struts2框架中,上传不需要添加额外的jar,上传默认使用Apache的上传组件fileupload;我们可以直接使用

需要注意的是,上传组件只是帮我们把上传的文件流转为文件数据的封装,上传保存的逻辑代码还是需要我们自己来完成;

(1)demo1.jsp

<form action="demo1Action!upload.action" method="post" enctype="multipart/form-data">
文件1:<input type="file" name="myFile"/><br/>
<input type="submit" value="上 传"/>
</form>

(2)Demo1Action

@Setter
@Getter
public class Demo1Action extends ActionSupport { private File myFile; //上传的文件
//myFile是表单name元素,后面的FileName和ContentType是固定的
private String myFileFileName; //上传文件名
private String myFileContentType; //上传文件类型 public String upload(){ try {
System.out.println("文件名:"+myFileFileName+",文件类型:"+myFileContentType); //上传路径
String path = ServletActionContext.getServletContext().getRealPath("/upload/");
path += myFileFileName;
//上传(流操作)
//输出流
FileOutputStream fos = new FileOutputStream(path);
//输入流
FileInputStream fis = new FileInputStream(myFile); //读取和写入
byte[] b = new byte[1024];
int len = 0;
while((len=fis.read(b)) != -1){
fos.write(b, 0, len);
} //关闭
fis.close();
fos.flush();
fos.close();
return SUCCESS;
} catch (Exception e) {
e.printStackTrace();
} return INPUT;
} }

(3)struts.xml

<action name="demo1Action" class="com.yujun.maven.action.Demo1Action">

 </action>

2、下载

https://struts.apache.org/core-developers/stream-result.html

(1)demo2.jsp

<h4>
<a href="demo2Action!download.action?fileName=第二章-选择器.pptx">第二章-选择器.pptx</a>
</h4>
<h4>
<a href="demo2Action!download.action?fileName=jquery-3.2.1.min.js">jquery-3.2.1.min.js</a>
</h4>

(2)Demo2Action

@Setter
@Getter
public class Demo2Action extends ActionSupport { private String fileName; //文件名
private InputStream is; //输入流 public String download(){ try {
System.out.println("文件名:"+fileName);
//下载路径
String path = ServletActionContext.getServletContext().getRealPath("/download/");
path += fileName; //文件输入流
is = new FileInputStream(path); //文件名进行下载时乱码处理
fileName = new String(fileName.getBytes(),"iso-8859-1");
return SUCCESS;
} catch (Exception e) {
e.printStackTrace();
} return INPUT;
}
}

(3)struts.xml

<action name="demo2Action" class="com.yujun.maven.action.Demo2Action">
<!-- type=stream 表示流 -->
<result name="success" type="stream">
<!-- 设置下载的类型:这里表示流类型 -->
<param name="contentType">application/octet-stream</param>
<!-- action类中的输入流成员变量名 -->
<param name="inputName">is</param>
<!-- 下载时的文件名,${fileName}表示引用action类中的成员变量 -->
<param name="contentDisposition">attachment;filename=${fileName}</param>
<!-- 下载时的缓冲大小 -->
<param name="bufferSize">1024</param>
</result>
</action>

三、i18n国际化

internationalization  的首字母i和尾字母n,18中间字符数

国际化:根据不同的语言和地区显示不同界面内容

标识符:

zh  中文

CN  中国

en   英文

US  美国

1、新增语言资源文件

src目录/xxx_zh_CN.properties   中文

src目录/xxx_en_US.properties   英文

xxx是自定义的

2、struts.xml

<!-- 开启国际化配置,lang是国际化资源文件的前缀,如果有多个资源文件,可以使用逗号分隔开 -->

<constant name="struts.custom.i18n.resources" value="lang"/>

3、页面

<%@ taglib prefix="s" uri="/struts-tags" %>
<form>
<s:property value="%{getText('uname')}"/>:<input/><br/><br/>
<s:property value="%{getText('pname')}"/>:<input/><br/><br/>
<input type="submit" value="<s:property value="%{getText('btnLogin')}"/>"/>
</form>

4、动态切换语言

(1)页面

<h4>
<a href="langAction?request_locale=zh_CN">中文</a>
<a href="langAction?request_locale=en_US">英文</a>
</h4>

(2)LangActoin

public class LangAction extends ActionSupport {

    @Override
public String execute() throws Exception {
return SUCCESS;
}
}

(3)struts.xml

<action name="langAction" class="com.yujun.maven.action.LangAction">
<result>/login.jsp</result>
</action>

struts2-剩余的更多相关文章

  1. Struts2拦截器之FileUploadInterceptor

    一.它能做什么? 借助于这个拦截器我们可以实现文件的上传和下载功能. 理论部分: struts2的文件上传下载功能也要依赖于Apache commons-fileupload和Apache commo ...

  2. Struts2(十四)拦截器实现权限管理

    一.认识拦截器 拦截器也是一个类 拦截器可以在Action被调用之前和之后执行代码 框架很多核心功能是拦截器实现的 拦截器的特点: 拦截器自由组合,增强了灵活性.扩展性.有利于系统解耦 拦截器可以拦截 ...

  3. 转载:struts2和spring的结合原理(精品)

    转载网址:http://blog.sina.com.cn/s/blog_683278bc0101236z.html Ioc将所有的对象之间的关系转移到了xml配置文件中来. 在TopLogic中声明存 ...

  4. 浅谈Struts2(四)

    一.Struts2的拦截器(Intercept) 作用:把多个Action中的共有代码,提取至拦截器,从而减少Action中的冗余代码. 1.Action拦截器 a.编写interceptor类 pu ...

  5. struts2之拦截器

    1. 为什么需要拦截器 早期MVC框架将一些通用操作写死在核心控制器中,致使框架灵活性不足.可扩展性降低, Struts 2将核心功能放到多个拦截器中实现,拦截器可自由选择和组合,增强了灵活性,有利于 ...

  6. 第四章 Struts2深入

    4.1 Struts2架构    1.ActionMapper:        提供请求和Action之间的映射.根据请求查找是否存在对于的action,如有,翻译描述action映射的ActionM ...

  7. 自定义简单的struts2的s标签

    一:自定标签前需要了解的知识: BodyTagSupport类的方法: 编写标签对应的实现类时,需要重载BodyTagSupport类几个方法:doStartTag(), setBodyContent ...

  8. Struts2+Hibernate实现图书管理系统

    效果图 部分代码 Books.java package entity; import java.util.Date; public class Books { //书籍编号 private Strin ...

  9. Struts2 学习笔记(概述)

    Struts2 学习笔记 2015年3月7日11:02:55 MVC思想 Strust2的MVC对应关系如下: 在MVC三个模块当中,struts2对应关系如下: Model: 负责封装应用的状态,并 ...

  10. struts2 基础5 OGNL、标签、四大域、默认拦截器说明

    OGNL表达式 OGNL:对象导抗图语言 OGNL表达式是一个上下文的概念,上下文Map结构 OGNL表达式需要使用#标注命名空间.访问上下文(Context)中的对象需要使用#符号标注命名空间,如# ...

随机推荐

  1. [ZJOI2019]线段树

    题目大意 一开始有一棵线段树,然后有一个操作序列,问执行这个操作序列的所有子集时线段树上有标记的节点个数和. 题解 其实我们把它除以\(2^m\)后发现就是有标记节点的期望个数. 然后套路的根据期望的 ...

  2. 自定义select标签箭头样式

    select::-ms-expand{ display: none; }//ie样式清除 select{ appearance:none; -moz-appearance:none; -webkit- ...

  3. Vue(三)指令

    v-text:更新元素的text内容 <template> <div class="about"> <p v-text="msg" ...

  4. 在IntelliJ IDEA中,注解@Slf4j找不到log

    问题: 解决方法:

  5. kubernetes之管理容器的计算资源

    资源类型 CPU 和 memory 都是 资源类型.资源类型具有基本单位.CPU 的单位是 core,memory 的单位是 byte.这些都统称为计算资源. CPU含义: CPU 资源的限制和请求以 ...

  6. Vue学习笔记六:v-model 数据双向绑定

    目录 v-model简介和适用范围 新建HTML 所见即所得 v-model模拟简易计算器 v-model简介和适用范围 Vue的一大特点之一就是数据的双向绑定,v-model就是实现这个功能的指令, ...

  7. js/vue图片压缩

    js版 新建compressImage.js,内容如下: // 将base64转换为blob(有需要可加上,没需要可不加) function convertBase64UrlToBlob(urlDat ...

  8. Docker安装rabbitmq

    前面的文章中我们的docker已经安装好了,我的最终目的是用docker来安装rabbitmq,所以本文我记录一下我用docker安装rabbitmq的过程: 1.下载镜像(下载management的 ...

  9. ArcGis dbf读写——挂接Excel到属性表 C#

    ArcMap提供了挂接Excel表格信息到属性表的功能,但是当数据量较大到以万计甚至十万计的时候这个功能就歇菜了,当然,你可以考虑分段挂接.这个挂接功能只是做了一个表关联,属性记录每个字段的信息需要通 ...

  10. JavaScript在div后添加删除div

    var idd = 'str'; $('.task-done-detail-content-p7').click(function () { var id = this.id; if(idd !== ...