首先在文章之前,我们先讲解一下struts2的优点
(1) 实现了MVC模式,层次结构清晰,使程序员只需关注业务逻辑的实现。
(2) 丰富的标签库,大大提高了开发的效率。
(3) Struts2提供丰富的拦截器实现。
(4) 通过配置文件,就可以掌握整个系统各个部分之间的关系。
(5) 异常处理机制,只需在配置文件中配置异常的映射,即可对异常做相应的处理
(6) Struts2的可扩展性高
(7) 面向切面编程的思想在Strut2中也有了很好的体现
一 丶struts2的环境配置
1.struts.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!-- 动态调用打开 -->
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<!-- 开发者模式 -->
<constant name="struts.devMode" value="true" />
<package name="default" namespace="/" extends="struts-default">
<action name="xxx" class="xxx">//name为action的名字,class为action文件的路径名
<result name="success">xxx.jsp</result>//接收返回值,type类型分别可以为:redirect,redirectAction(重定向,跳转action)
</action>
</package>
</struts>
下面有一些网上找到的资料,学习时可能用不到,工作时应该会用到,就先发这里
struts.serve.static.browserCache 该属性设置浏览器是否缓存静态内容。当应用处于开发阶段时,我们希望每次请求都获得服务器的最新响应,则可设置该属性为false。
struts.enable.DynamicMethodInvocation 该属性设置Struts 2是否支持动态方法调用,该属性的默认值是true。如果需要关闭动态方法调用,则可设置该属性为false。
struts.enable.SlashesInActionNames 该属性设置Struts 2是否允许在Action名中使用斜线,该属性的默认值是false。如果开发者希望允许在Action名中使用斜线,则可设置该属性为true。
struts.tag.altSyntax 该属性指定是否允许在Struts 2标签中使用表达式语法,因为通常都需要在标签中使用表达式语法,故此属性应该设置为true,该属性的默认值是true。
struts.devMode该属性设置Struts2应用是否使用开发模式。如果设置该属性为true,则可以在应用出错时显示更多、更友好的出错提示。该属性只接受true和flase两个值,该属性的默认值是false。通常,应用在开发阶段,将该属性设置为true,当进入产品发布阶段后,则该属性设置为false。
struts.i18n.reload该属性设置是否每次HTTP请求到达时,系统都重新加载资源文件。该属性默认值是false。在开发阶段将该属性设置为true会更有利于开发,但在产品发布阶段应将该属性设置为false。
提示 开发阶段将该属性设置了true,将可以在每次请求时都重新加载国际化资源文件,从而可以让开发者看到实时开发效果;产品发布阶段应该将该属性设置为false,是为了提供响应性能,每次请求都需要重新加载资源文件会大大降低应用的性能。
struts.ui.theme该属性指定视图标签默认的视图主题,该属性的默认值是xhtml。
struts.ui.templateDir该属性指定视图主题所需要模板文件的位置,该属性的默认值是template,即默认加载template路径下的模板文件。
struts.ui.templateSuffix该属性指定模板文件的后缀,该属性的默认属性值是ftl。该属性还允许使用ftl、vm或jsp,分别对应FreeMarker、Velocity和JSP模板。
struts.configuration.xml.reload该属性设置当struts.xml文件改变后,系统是否自动重新加载该文件。该属性的默认值是false。
struts.velocity.configfile该属性指定Velocity框架所需的velocity.properties文件的位置。该属性的默认值为velocity.properties。
struts.velocity.contexts该属性指定Velocity框架的Context位置,如果该框架有多个Context,则多个Context之间以英文逗号(,)隔开。
struts.velocity.toolboxlocation该属性指定Velocity框架的toolbox的位置。
struts.url.http.port该属性指定Web应用所在的监听端口。该属性通常没有太大的用户,只是当Struts2需要生成URL时(例如Url标签),该属性才提供Web应用的默认端口。
struts.url.https.port该属性类似于struts.url.http.port属性的作用,区别是该属性指定的是Web应用的加密服务端口。
struts.url.includeParams该属性指定Struts 2生成URL时是否包含请求参数。该属性接受none、get和all三个属性值,分别对应于不包含、仅包含GET类型请求参数和包含全部请求参数。
struts.custom.i18n.resources该属性指定Struts2应用所需要的国际化资源文件,如果有多份国际化资源文件,则多个资源文件的文件名以英文逗号(,)隔开。
struts.dispatcher.parametersWorkaround 对于某些Java EE服务器,不支持HttpServlet Request调用getParameterMap()方法,此时可以设置该属性值为true来解决该问题。该属性的默认值是false。对于WebLogic、Orion和OC4J服务器,通常应该设置该属性为true。
struts.freemarker.manager.classname 该属性指定Struts2使用的FreeMarker管理器。该属性的默认值是org.apache.struts2.views.freemarker.FreemarkerManager,这是Struts 2内建的FreeMarker管理器。
struts.freemarker.wrapper.altMap该属性只支持true和false两个属性值,默认值是true。通常无需修改该属性值。
struts.xslt.nocache 该属性指定XSLT Result是否使用样式表缓存。当应用处于开发阶段时,该属性通常被设置为true;当应用处于产品使用阶段时,该属性通常被设置为false。
struts.configuration.files 该属性指定Struts2框架默认加载的配置文件,如果需要指定默认加载多个配置文件,则多个配置文件的文件名之间以英文逗号(,)隔开。该属性的默认值为struts-default.xml,struts-plugin.xml,struts.xml,看到该属性值,读者应该明白为什么Struts 2框架默认加载struts.xml文件了。
在请求时,路径后的后缀action可要可不要,即下面的两种请求都是可以的
http://localhost:8080/Struts2/chapter1/HelloWorld
http://localhost:8080/Struts2/chapter1/HelloWorld.action
2.web.xml文件
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-map
ping>
3.需要使用到的jar包
<p>
用户名 :<input type="text" name="user.name" id="uname" >
</p>
<p>
密码: <input type="password" name="user.pwd" id="upwd">
</p>
String name = user.getName();
String pwd = user.getPwd();
if(null!=name&&!" ".equals(name)){
ActionContext.getContext().getSession().put("userinfo", user);
}
if(null==name||"".equals(name)){
System.out.println("帐号密码错误");
return "hello1";
}
return SUCCESS;
}
ActionContext.getContext().getSession().get("userinfo");
return super.execute();
}
<interceptor name="inter" class="com.hp.test.Myinterceptor"></interceptor>
<interceptor-stack name="mydefault">
<interceptor-ref name="defaultStack" />
<interceptor-ref name="inter" />
</interceptor-stack>
</interceptors>
<global-results>
<result name="error">error.jsp</result>
</global-results>
<interceptor-ref name="mydefault"></interceptor-ref>
<result name="success" type="redirect">success.jsp</result>
</action>
<action name="hello" class="com.hp.test.Action">
<interceptor-ref name="defaultStack"></interceptor-ref>
<result name="success" type="redirectAction">index</result>
<result name="null">login.jsp</result>
</action>
User user=(User) ActionContext.getContext().getSession().get("userinfo");
if(null!=user&&!" ".equals(user)) {
System.out.println("登录成功");
return arg0 .invoke();
}else {
System.out.println("拦截成功");
return "error";
这样,我们就完成了使用拦截器来验证用户登录的效果
3.使用struts实现文件上传效果
在做B/S系统时,通常会涉及到上传文件和下载文件,在没接struts2框架之前,我们都是使用apache下面的commons子项目的FileUpload组件来进行文件的上传,但是那样做的话,代码看起来比较繁琐,而且不灵活,在学习了struts2后,struts2为文件上传下载提供了更好的实现机制,在这里我分别就单文件上传和多文件上传的源代码进行一下讲解,这里需要导入文件下载上传的两个jar文件,一个是commons-fileupload-1.2.2.jar,另一个是commons-io-2.0.1.jar
下面是jsp页面代码
<form action="Upfile" method="post" enctype="multipart/form-data">
<input type="file" name="file"><br>
<input type="submit" value="upfile">
注意:name名跟action中的属性名有对应关系,尽量不要乱起!
下面时上传时对应的action功能代码
ublic class UpFile extends ActionSupport implements RequestAware {
//注意,file并不是指前端jsp上传过来的文件本身,而是文件上传过来存放在临时文件夹下面的文件
private File file;
//提交过来的file的名字
private String fileFileName;
//提交过来的file的MIME类型
private String fileContentType;
private FileInputStream in;
private String filename;
private Map<String, Object> request;
public File getFile() {
return file;
}
public void setFile(File file) {
this.file = file;
}
public String getFileFileName() {
return fileFileName;
}
public void setFileFileName(String fileFileName) {
this.fileFileName = fileFileName;
}
public String getFileContentType() {
return fileContentType;
}
public void setFileContentType(String fileContentType) {
this.fileContentType = fileContentType;
}
@Override
public String execute() throws Exception {
fileFileName=new Date().getTime()+fileFileName;
String root=ServletActionContext.getServletContext().getRealPath("images/"+fileFileName);
in=new FileInputStream(file);
FileOutputStream os = new FileOutputStream(root);
System.out.println("fileFileName: " + fileFileName);
System.out.println("路径为:"+root);
byte[] b=new byte[1024];
int len=0;
while((len=in.read(b))>0) {
os.write(b, 0, len);
}
os.close();
in.close();
String images="images/"+fileFileName;
request.put("images", images);
return SUCCESS;
}
public void setRequest(Map<String, Object> arg0) {
// TODO Auto-generated method stub
this.request=arg0;
}
}
最后在struts.xml中进行相关的配置
<constant name="struts.devMode" value="true"></constant>
<constant name="struts.multipart.maxSize" value="10485760"/> //配置文件大小,配置后可以上传较大的文件
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
<package name="default" namespace="/" extends="struts-default">
<action name="Upfile" class="com.hp.upfile.UpFile">
<result name="success">success.jsp</result>
<result name="input">error.jsp</result>
这样,我们就使用struts2完成了文件上传的功能.
struts2框架有很多优秀的功能,我这里就简单说到这里了,欢迎朋友们多多指导.不胜感激