struts2框架总结



首先在文章之前,我们先讲解一下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包

二丶实现登录功能
1.写出简单的jsp页面
<form action="login" method="post">
<p>用户登录</p>
 <p>
  用户名 :<input type="text" name="user.name" id="uname" >
 </p>
 <p>
  密码: <input type="password" name="user.pwd" id="upwd">
 </p>
</form>
2.因为在本案例中我们使用了拦截器进行登录验证,所以在action中接收并且传输数据
public String execute() throws Exception {
   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;
 }
下面是跳转到的action页面中的方法实现接收数据并跳转到jsp页面显示
public String execute() throws Exception {
   ActionContext.getContext().getSession().get("userinfo");
  return super.execute();
 }
下面给出的是struts.xml拦截器的配置

<interceptors>
   <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="null">login.jsp</result>
   <result name="error">error.jsp</result>
  </global-results>
因为使用拦截器时可能会出现传值失败的问题,所以我们在这里加入默认拦截器形成拦截器栈,并且配置了  <global-results>  </global-results>达到全局接收返回值的效果
下面则是在action中,使用相关的拦截器
 <action name="index" class="com.hp.test.Actio2">
   <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>
最后,是拦截器的代码
public String intercept(ActionInvocation arg0) throws Exception {
  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框架有很多优秀的功能,我这里就简单说到这里了,欢迎朋友们多多指导.不胜感激


猜你喜欢

转载自blog.csdn.net/wodetian1225/article/details/79074653