一、昨天看的是文件上传,今天看了下文件下载
我们一般做文件下载时都是直接在a标签中写文件在服务器端的路径,这样做有两个问题:
(1)遇到中文的文件名时,可能会因为编码的问题而造成不能下载
(2)有些时候可能会遇到权限问题,比如控制用户的下载
这时候,我们就要用到struts的下载了。
<action name="uploadByStruts" class="com.struts.action.UploadAction" method="uploadByStruts">
<param name="inputPath">/upload/会议安排.xlsx</param>
<result type="stream">
<param name="inputName">targetFile</param>
<param name="contentDisposition">filename="agend.xlsx"</param>
<param name="bufferSize">4096</param>
</result>
</action>
public InputStream getTargetFile(){
return ServletActionContext.getServletContext().getResourceAsStream(inputPath);
}
public String uploadByStruts(){
return SUCCESS;
}
这样我们可以在服务器端指定下载文件的位置,并且由于是经过action的,所以可以对权限做控制。
二、我们的微年会项目做了一个demo,新浪在全站推广后,昨天来了第一个需求,是三菱公司的一个新车发布会
由于涉及到访问的域名问题,我们是这样规定的:
(1)用户可以自定去万网申请域名,然后我们做完项目后,会在服务器单独为这个应用跑一个tomcat,这个就是通常的做法,然后到nginx中去配置
一般部署tomcat,有三种情况
(1)在tomcat的webapp下直接扔各种war包,那么tomcat在启动时就会加载webapp下的war包,比如第一个war的名字是test1.war,第二个是test2.war,那么访问的时候就是
(2)有时候我们不想把应用放到webapp下,那么我们可以指定war包的位置,方法是在server.xml中的host节点下配置多个context,比如
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
这个是tomcat的默认配置,我们可以这样配置
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
<Context path ="/test1" reloadable ="false" docBase ="F:/test1"/>
<Context path ="/test2" reloadable ="false" docBase ="F:/test2"/>
</Host>
其中,path即context
path;docBase指向应用所在的文件夹或war文件,可以是绝对路径,也可以是相对路径(相对该Context所在的Host的appBase属性值);
(3)在tomcat的conf/[Engine]/[Host]目录下新建xml文件,文件名为context
path,比如我们上面配置的host的名字是localhost,engine是catalina,那么在conf/catalina/localhost中,新建一个test1.xml,里面的内容就是配置context,和2一样
这样,就完成了tomcat部署的三种方式
三、struts的namespace
<s:form action="/user/test/userAction" method="post">
<s:textfield label="姓名" name="user.name"></s:textfield>
<s:textfield label="年龄" name="user.age" value="0"></s:textfield>
<s:submit value="提交"></s:submit>
</s:form>
比如我们的表单现在是这样,它请求的action是/user/userAction
然后在struts.xml中,我们定义userAction的package的namaspace是/user,也就是说正常访问的路径应该是/user/userAction,但是我们同样可以提交这个表单,进入到相应的方法中,说明struts对于访问路径的处理是先精确查找,也就是先去查找namespace为/user/test中有没有userAction,如果没有的话,就去查找/user中的,如果还是没有,就去查找namespace为/下面的action,如果还没有就去默认的namespace下面,即“”下查找。
<action name="successAction" class="com.struts.action.SuccessAction">
<result>/success.jsp</result>
</action>
而且在result中,资源的路径是相对于浏览器的,和namespace无关
发现一件很有意思的事情:
<action name="*" class="com.struts.action.UserAction" method="universal">
<result>/success.jsp</result>
</action>
<action name="*Action" class="com.struts.action.UserAction" method="{1}">
<result>/success.jsp</result>
</action>
这是我在struts.xml中的配置,如果请求的uri是/user/studentAction,那么那个方法会被引用到呢?也许你会觉得*Action更匹配studentAction,但是错了,在这样的情况下*和*Action的匹配机会是均等的,所以就按照声明的顺序来执行了。
for (Object cfg : config.getPackageConfigs().values()) {
String ns = ((PackageConfig) cfg).getNamespace();
if (ns != null && prefix.startsWith(ns) && (prefix.length() == ns.length() || prefix.charAt(ns.length()) == '/')) {
if (ns.length() > namespace.length()) {
namespace = ns;
}
}
if ("/".equals(ns)) {
rootAvailable = true;
}
}
你看,源码就支持这么匹配的,比如我的访问路径是/user/test/studengAction,namespace是/user,action名字是studentAction,也就是说ns==“/user”,prefix=="/user/test"
如果ns!=null,且prefix以ns开头,这些都符合,他俩长度不等,但是prefix.charAt(ns.length()) == '/'))符合,所以还是可以找到这个动作的。
四、java对国际化的支持
Locale locale = Locale.getDefault();
ResourceBundle bundle = ResourceBundle.getBundle("messageResource", locale);
System.out.println(bundle.getString("user.required"));
我们在类路径下建立messageResource_zh_CN.properties和messageResource_en_US.properties两个文件,在这两个文件中,配置key-value形式的键值对,然后运行,可以得到中文系统环境下的value。
分享到:
相关推荐
...并在代码中适当修改URL为本地链接 项目功能 ... ...1.3 登录(验证码).......1.4 修改用户信息.......3.1日记与便签列表.... 16 3.2添加日记与便签.... 16 3.3编辑日记与便签.... 19 3.4删除日记与便签.... 21
12_012_云R记_用户模块_用户登录_思路分析.mp4 13_013_云R记_用户模块_用户登录_后端代码实现.mp4 14_014_云R记_用户模块_用户登录__功能测试.mp4 15_015_云R记_用户模块_BaseDao.mp4 16_016_云R记_用户模块_BaseDao...
运行七日记.exe即可本地测试。谢谢 12、后台管理账号和密码:www.iriji.com 13、下一版本展望:增加日记静态生成、增加后台皮肤管理、情人日记。 14、最后谢谢使用,如有好建议请到BBS.qifin.com发表。
大年初一日记过年的日记.pdf IT知识点: 1. 记录日记的重要性:通过这篇日记,我们可以看到记录日记的重要性。日记可以帮助我们记录和反思自己的生活经历,总结经验和教训,从而提高自己的素质和能力。 2. 文本...
"数据库脚本库 12-14日更新.zip" 文件是这个库的最新版本,更新了从12日至14日之间的内容,这意味着它可能包含了新的查询语句、优化的脚本或者新增的功能。 在数据库管理中,查询命令是基础,也是关键。这些命令...
运行七日记.exe即可本地测试。谢谢 12、后台管理账号和密码:www.qiriji.com 13、下一版本展望:增加日记静态生成、增加后台皮肤管理、情人日记。 14、最后谢谢使用,如有好建议请到BBS.qifin.com发表。
12. **工程材料、构配件、设备报验**:确认使用的材料、配件和设备是否符合设计和规范要求,是否有合格证明。 13. **工程报验检测**:记录工程报验的过程,包括检测结果,确保符合标准。 14. **见证取样送检**:...
12. learning from mistakes:作者描述了从错误中吸取教训的重要性,体现了实践和错误的重要性。 13. creativity and innovation:作者描述了自己的创意和创新,体现了设计师需要具备的创造力和创新精神。 14. ...
招商银行银企直连接口说明书 version 5.36.0 目录 1.1 用户登录..........................................................15 1.2 用户退出..........................................................17 1.3 ...
- **连续观察**:如文中所述,从4月12日至14日,每日定时观察绿豆的状态,记录下绿豆的变化,如体积、颜色、形状等。 - **描述变化**:比如绿豆从“绿小胖子”到“破皮”再到“钻出小脑袋”的过程,用生动的语言...
2. **公共空间的局限性**:尽管微博提供了一个公共空间供人们交流信息,但在2011年5月14日的微博中,张一鸣指出这种单一的空间形式存在效率和吞吐量的限制,因此他思考是否有其他产品形式可以创建更多面向特定受众的...
11. **休闲娱乐**:孩子在休息日的活动选择,如玩游戏、看电视,反映了娱乐对儿童成长的影响。 12. **购物体验**:孩子参与购买文具的过程,学习如何选择个人喜好,并关注到家长的喜好。 13. **时间管理**:在假期...
12. □电话连络 □传真联络:记录处理该异常单的人员的联系方式,以便于与处理人进行沟通。 13. 联络人:记录处理该异常单的人员的名称,以便于了解处理人。 14. 客户答复或承诺:记录客户对异常单的答复或承诺,以...
12. **机房温度**:过高温度可能导致设备过热,影响电梯的正常运行。 13. **轿厢门联锁**:确保门关闭后电梯才能启动,防止门未关时电梯意外运行。 14. **安全触板及开关**:防止乘客被夹,保证安全进出。 15. **...
'14.函数作用:从右边开始查找指定字符在字符串中的位置...43 '15.函数作用:从右边开始查找指定字符在字符串中的位置...44 '16.函数作用:计算工龄.................................44 '17.函数作用:计算日期差,除去...
14. 网站开发基础:实习生学习了网站开发的基础知识,包括网站开发的原则、网站结构、网站元素等。 15. IT 部门管理:实习生学习了 IT 部门的管理,包括 IT 部门的组织结构、职责分配、项目管理等。 通过这份实习...
1. 国庆节的含义:国庆节是中国的法定节日,庆祝中华人民共和国成立的日子,每年的10月1日。 2. 学校活动:文中提到学校在国庆节当天不放假,而是安排了特别活动,可能是为了让学生更好地理解和庆祝这个节日。 3. ...
在现代社会中,人力资源管理系统对于公司的重要性日益增加。传统的人工记录方式已经无法满足高速更替的员工流量。因此,开发一个高效、智能化的人力资源管理系统势在必行。该系统可以减轻工作人员的工作量,提高管理...