一、国际化
hai=你好
zh CN
hai=hello
en
US
hai=你好
1、先写配置文件properties
key=hello
jsp.login.username=Username
jsp.login.pwd=PassWord
jsp.login.deng=deng
2、配置struts
<struts>
<constant name ="struts.devMode" value ="true"></constant>
<!-- 配置国际化资源 -->
<constant name="struts.custom.i18n.resources" value="com.lzh.resource.message"></constant>
<package name="p1" extends="struts-default">
<action name="action1" class="com.lzh.web.action.TestAction">
<result name="success">/success.jsp</result>
</action>
</package>
</struts>
3、写动作类
public class TestAction extends ActionSupport {
public String execute() throws Exception{
String value =getText("key");
System.out.println(value);
return SUCCESS;
}
}
4、jsp页面
<body>
<!-- 直接访问jsp页面,使用的是全局范围的资源
通过action访问jsp页面,先找动作类范围的资源,没有再去找包里的,包里没有再找全局的
-->
<s:text name="key"></s:text>
<s:text name="hah"></s:text><!-- 找不到时直接输出键名 -->
<!-- 通过action访问jsp页面实现访问全局范围的资源 用s:i18n标签-->
<s:i18n name="com.lzh.resource.message">
<s:text name="key"></s:text>
</s:i18n>
<!-- name 属性的值不存在,会按照默认的搜索顺序去查找 -->
<s:i18n name="com.lzh.resources.message">
<s:text name="key"></s:text>
</s:i18n>
</body>
4、配置文件分别放在不同的位置
二、Struts中的拦截器(非常重要)
1、拦截器的重要性
struts2中的很多功能都是有拦截器完成的。比如:servletConfig,staticParam,params,modelDriven等待
是AOP编程思想的一种应用形式。
2、拦截器执行的时机:
ActionInvocation
3、自定义拦截器
1、配置struts
<struts>
<constant name="struts.devMode" value="true"></constant>
<package name="p1" extends="struts-default">
<!-- 声明拦截器 -->
<interceptors>
<interceptor name="myinterceptor" class="com.lzh.webinterceptor.MyInterceptor"></interceptor>
<interceptor name="myinterceptor2" class="com.lzh.webinterceptor.MyInterceptor2"></interceptor>
</interceptors>
<action name="action1" class="com.lzh.web.action.TestAction" method="test">
<!-- 指定拦截器的引用,默认的拦截器没了
当多个拦截器存在时,按引用的顺序执行
-->
<interceptor-ref name="myinterceptor"></interceptor-ref>
<interceptor-ref name="myinterceptor2"></interceptor-ref>
<result name="success">/success.jsp</result>
<result name="input">/test.jsp</result>
</action>
</package>
</struts>
2、写TestAction
public class TestAction extends ActionSupport {
public String test(){
System.out.println("动作方法执行了");
return SUCCESS;
}
}
3、自定义拦截器
public class MyInterceptor extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation arg0) throws Exception {
//放行之前做的事儿
System.out.println("拦截器1拦截了。。。");
//放行
String value=arg0.invoke();
System.out.println(value);
System.out.println("回来时的1拦截");
return null;
}
}
4、自定义拦截器判断用户是否登陆
1、配置struts
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.devMode" value="true"></constant>
<pre name="code" class="html"> <!-- 使用拦截器判断用户是否登录,登陆了则可以访问home.jsp -->
<package name="p2" extends="struts-default">
<interceptors>
<interceptor name="checkLogin" class="com.lzh.webinterceptor.CheckLoginInterceptor"></interceptor>
<interceptor-stack name="myStack">
<interceptor-ref name="defaultStack"></interceptor-ref>
<!-- 使用注入,指明拦截器不能拦截的方法 -->
<interceptor-ref name="checkLogin">
<!-- <param name="excludeMethods">login</param>-->
</interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myStack"></default-interceptor-ref>
<global-results>
<result name="input">/login.jsp</result>
</global-results>
<!-- 登录提交到的action -->
<action name="login" class="com.lzh.web.action.LoginAction" method="login">
<interceptor-ref name="myStack">
<param name="checkLogin.excludeMethods">login</param>
</interceptor-ref>
<result name="success" type="redirectAction">showHome</result>
</action>
<!-- 需要被拦截的 -->
<action name="showHome" class="com.lzh.web.action.LoginAction">
<result name="success">/home.jsp</result>
</action>
<!-- 需要被拦截 -->
<action name="showOther" class="com.lzh.web.action.LoginAction" method="login">
<result name="success">/other.jsp</result>
</action>
</package>
</struts>
2、写login方法的action
public class LoginAction extends ActionSupport {
public String login(){
HttpSession session = ServletActionContext.getRequest().getSession();
session.setAttribute("user", new Object());
return SUCCESS;
}
}
3、自定义拦截器
public class CheckLoginInterceptor extends MethodFilterInterceptor{//里面有excludeMethod和 includeMethod 是AbstractInterceptor 的子类
@Override
public String doIntercept(ActionInvocation arg0) throws Exception {
//验证是否登录的拦截器
//得到HttpRequest
HttpServletRequest request=ServletActionContext.getRequest();
//得到HttpSession
HttpSession session = request.getSession();
//从session中获取对象
Object obj=session.getAttribute("user");
if(obj!=null)
//放行
return arg0.invoke();
return "input";
}
}
三、上传文件
1、jsp里
<body>
<s:form action="upload.action" enctype="multipart/form-data">
<s:textfield name="username" lable="用户名"></s:textfield>
<s:file name="photo" value="图片"></s:file>
<s:submit value="提交"></s:submit>
</s:form>
</body>
2、struts配置
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.devMode" value="true"></constant>
<!-- 控制上传文件的大小 -->
<constant name="struts.multipart.maxSize" value="5242880"></constant>
<package name="p1" extends="struts-default">
<action name="upload" class="com.lzh.web.action.UploadAction" method="upload">
<interceptor-ref name="defaultStack">
<!-- 设置允许的上传文件的扩展名 -->
<!-- <param name="fileUpload.allowedExtensions">jsp,png,gif,bmp</param>-->
<!-- 设置上传文件允许的MIME类型 -->
<param name="ifleUpload.allowedTypes">image/jpg,image/pjpeg,image/gif</param>
</interceptor-ref>
<!-- <result name="input">/upload.jsp</result>-->
</action>
</package>
</struts>
3、上传文件的Action
package com.lzh.web.action;
import java.io.File;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class UploadAction extends ActionSupport {
private String username;
private File photo;
private String photoFileName;//获取文件名(struts将文件名封装进来了) 命名规则:表单上的字段名+fileName
private String photoContentType;//上传的文件的MIME类型 image/png
//方法中实现文件上传
public String upload(){
//创建存储上传的文件的目录
String path=ServletActionContext.getServletContext().getRealPath("/WEB-INF/upload");
File dir = new File(path);
if(!dir.exists())
dir.mkdirs();
//把临时文件拷到目标目录下,临时文件还存在
//FileUtils.copyFile(new File(photoFileName), dir);
//剪切到目标目录下
photo.renameTo(new File(dir,photoFileName));
return null;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public File getPhoto() {
return photo;
}
public void setPhoto(File photo) {
this.photo = photo;
}
public String getPhotoFileName() {
return photoFileName;
}
public void setPhotoFileName(String photoFileName) {
this.photoFileName = photoFileName;
}
public String getPhotoContentType() {
return photoContentType;
}
public void setPhotoContentType(String photoContentType) {
this.photoContentType = photoContentType;
}
}