Struts2的插件的使用方法

1.注解插件

  我们如果要使用注解的功能 必须在struts2 已有的jar包的基础上 添加一个插件包 插件包一定要和struts2的版本保持一致
引入struts2-convention-plugin
基于maven方式
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-convention-plugin</artifactId>
<version>${struts2.version}</version>
</dependency>
<constant name="struts.convention.result.path" value="/WEB-INF/content/"/>
如果说你的返回页面 没有加/ 你的返回的路径前面会自动给你加上/WEB-INF/content/ 前缀
@Result(name="input",location ="${errorPage}.jsp")
/WEB-INF/content/${errorPage}.jsp
什么样的Action才能被我识别 包结构中必须包含action,actions,struts,struts2关键字并且类的后缀是Action才能被扫描到
这两个条件是并行的条件
<constant name="struts.convention.package.locators" value="action,actions,struts,struts2"/>

<constant name="struts.convention.action.suffix" value="Action"/>

2.SiteMesh

 .导入我们struts-sitemesh的插件 再pom文件中

<!-- https://mvnrepository.com/artifact/org.apache.struts/struts2-sitemesh-plugin -->

<dependency>
  <groupId>org.apache.struts</groupId>
  <artifactId>struts2-sitemesh-plugin</artifactId>
  <version>2.3.34</version>
</dependency>
2.再web.xml中添加核心过滤器
PS:这个过滤器一定要再struts2的过滤器的前面
<filter> 
 <filter-name>sitemesh</filter-name> 
  <filter-class>com.opensymphony.sitemesh.webapp.SiteMeshFilter</filter-class>
  </filter> 
   <filter-mapping> 
   <filter-name>sitemesh</filter-name> 
    <url-pattern>/*</url-pattern>
    </filter-mapping>
3.添加siteMesh的配置文件
1.新建一个文件的名称 decorators.xml
2.该配置文件必须放在WEB-INF目录下
3.配置文件的内容如下
<?xml version="1.0" encoding="UTF-8"?>
<decorators>
</decorators>
4.准备好我们要装饰的页面
我要把头部 和 底部给抽取出来 只要其中的内容部分
5.准备好一个母版
只有头部 只有底部 中间
<%@ taglib uri="http://www.opensymphony.com/sitemesh/decorator " prefix="decorator " %>
把中间部分 加上
< decorator:body ></ decorator:body >
6.设置装饰的规则
放过
< decorators defaultdir="/sitemesh" > //母版存放的目录
<!-- Any urls that are excluded will never be decorated by Sitemesh -->
<excludes>
<pattern>/css/*</pattern>
<pattern>/js/*</pattern>
<pattern>/images/*</pattern>
</excludes>

< decorator name="mother" page="mother.jsp" > 母版的名称
< pattern >/font/*</ pattern > //当请求匹配某个路径时 就会被母版所装饰
</ decorator >
</ decorators >

3.DWR插件之消息推送

 消息推送流程
1.在web.xml中添加 允许后台调用前台的配置

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
  <servlet>
    <display-name>DWR Servlet</display-name>
    <servlet-name>dwr-invoker</servlet-name>
    <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
    <init-param>
      <param-name>debug</param-name>
      <param-value>true</param-value>
    </init-param>
    <init-param>
      <param-name>crossDomainSessionSecurity</param-name>
      <param-value>false</param-value>
    </init-param>
    <init-param>
      <param-name>allowScriptTagRemoting</param-name>
      <param-value>true</param-value>
    </init-param>
    <init-param>
      <param-name>activeReverseAjaxEnabled</param-name>
      <param-value>true</param-value>
    </init-param>
    <init-param>
      <param-name>maxWaitAfterWrite</param-name>
      <param-value>1000</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>dwr-invoker</servlet-name>
    <url-pattern>/zxy/*</url-pattern>
  </servlet-mapping>
</web-app>
2.在页面上添加允许监听
<script>  
   //允许当前页面上的函数 被后台所调用
  dwr.engine.setActiveReverseAjax(true);
  //当页面关闭时 通知服务器 去除当前的session
    dwr.engine.setNotifyServerOnPageUnload(true);
    </script>  
  4.JaspserReporter插件
  报表 从多个地方获取数据
下载 PDF XLS
freemark 模板 xls
报表设计器 iReport 开源的工具 设计好模板
将模板的编译后的*.jaspter 拷贝出来
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-jasperreports-plugin</artifactId>
<version>${struts2.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/jasperreports/jasperreports -->
一定要使用5.5.0这个版本 这个版本和Struts2.3.34 配套使用
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports</artifactId>
<version>5.5.0</version>
</dependency>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>2.3.0</version>
</dependency>
注意的细节
模板中的filename=类中属性
String FORMAT_PDF = "PDF";
String FORMAT_XML = "XML";
String FORMAT_HTML = "HTML";
String FORMAT_XLS = "XLS";
String FORMAT_CSV = "CSV";
String FORMAT_RTF = "RTF";
插件中就新增了一个返回值类型 jasper
<struts>
<package name="jasperreports-default" extends="struts-default">
<result-types>
<result-type name="jasper" class="org.apache.struts2.views.jasperreports.JasperReportsResult"/>
</result-types>
</package>
</struts>
Action中
private List<Salary>salaryList=new ArrayList<>();
@Action(value = "getReport",results = {
@Result(name="success",type = "jasper",
location = "/report/report1.jasper",
params = {"dataSource","salaryList",
"format","HTML"})
})
public String getReport()
{
for(int i=0;i<100;i++)
{
Salary salary=new Salary();
salary.setDept("财务部");
salary.setWorkcode(i);
salary.setUname("张三"+i);
salary.setBase_salary(new BigDecimal(5000));
salary.setExtract(new BigDecimal(50000));
salary.setLeave(new BigDecimal(6000));
salary.setSick(new BigDecimal(7000));
salary.setPk(new BigDecimal(400));
salaryList.add(salary);
}
return "success"
;
}
可能会遇到的问题
0.格式不对 将以下的servlet 加入到web.xml 目的 让struts2 排除掉这个请求
<servlet>
<servlet-name>JasperReportImageServlet</servlet-name>
<servlet-class>
net.sf.jasperreports.j2ee.servlets.ImageServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>JasperReportImageServlet</servlet-name>
<url-pattern>/image.servlet</url-pattern>
</servlet-mapping>
1.
spring+jasperReport生成PDF格式的报表时报
java.lang.NoSuchMethodError: com.lowagie.text.pdf.PdfWriter.setRgbTransparencyBlending(Z)V异常
原因:iText.jar文件过旧,将之改为2.1版就没事了。
2. java.lang.NoClassDefFoundError: org/codehaus/groovy/control/CompilationFailedException异常 原因:没有导入 groovy-all.jar 包,导入 groovy-all.jar 包就可以了。
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>2.3.0</version>
</dependency>
3.Excle 应用:
java.lang.NoClassDefFoundError: org/apache/poi/hssf/usermodel/HSSFCellStyle
出现上述错误提示加入 poi-3.2-FINAL-20081019.jar
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency>

4.
net.sf.jasperreports.engine.JRRuntimeException: Could not load the following font :
pdfFontName : STSong-Light
pdfEncoding : UniGB-UCS2-H
isPdfEmbedded : false
出现上述错误提示加入
iTextAsian.jar
<dependency>
<groupId>com.lowagie</groupId>
<artifactId>itext</artifactId>
<version>2.1.7</version>
</dependency>
<dependency>
<groupId>com.itext</groupId>
<artifactId>iTextAsian</artifactId>
<version>2018</version>
</dependency>
如果还是不能显示中文 则修改模板
<textElement textAlignment="Center">
<font size="20" isBold="true" pdfFontName="STSong-Light" pdfEncoding="UniGB-UCS2-H"/>
</textElement>
5.
java.lang.NoClassDefFoundError: org/apache/commons/digester/Digester
出现上述错误提示加入
commons-digester-1.7.jar iReport/lib 功能简述:解析 xml 文件;
6.
java.lang.NoClassDefFoundError: org/apache/commons/collections/ArrayStack
出现上述错误提示加入
commons-beanutils-1.7.jar iReport/lib
7.
java.lang.NoClassDefFoundError: org/apache/commons/collections/ReferenceMap
出现上述错误提示加入

commons-collections-2.1.jar iReport/lib

5.JFreeChar插件

  1.引入所有的jfreechar的jar包
<!-- https://mvnrepository.com/artifact/org.jfree/jfreechart -->
<dependency>
<groupId>org.jfree</groupId>
<artifactId>jfreechart</artifactId>
<version>1.0.19</version>
</dependency>

2.引入struts2-jfreechart的插件包
<!-- https://mvnrepository.com/artifact/org.apache.struts/struts2-jfreechart-plugin -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-jfreechart-plugin</artifactId>
<version>${struts2.version}</version>
</dependency>

6.Urwriter插件管

  urlrewriter.jar包的官方下载地址:http://tuckey.org/urlrewrite/
若是下载不了,可以通过http://download.csdn.net/detail/liunian02050328/6470639下载
使用urlrewrite的优点:
1.为网站开发提供良好的搜索。
2.安全性,隐藏了原有的开发技术,网站的移植很强。
3.完全静态化为html页面,规范化
使用介绍:
1.将如下代码加到项目的web.xml中
<filter>
<filter-name>UrlRewriteFilter</filter-name>
<filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
<init-param>
<param-name>logLevel</param-name>
<param-value>WARN</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>UrlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern> </filter-mapping>

2.配置urlrewrite.xml文件来实现url静态化(可以在网站上
http://tuckey.org/urlrewrite/找到)
(1)普通url静态化
例如:要把http://localhost/prjtest/user/list.jsp转换成http://localhost/prjtest/user/list.html
这种是最简单的,当一个servlet跳转到list.jsp页面列出user列表时,在urlrewrite.xml中这样配置:
<rule>
<from>/user/list.html</from>
<to>/user/list.jsp</to>
</rule>
当请求/user/list.html这个页面时,实际上相当于请求/user/list.jsp页面
<rule>
<from>/index.html</from>
<to type="forward">/index.action</to>
</rule>
当请求index.html时直接转到index.action,实现请求的伪静态化。

(2)带参数的url静态化 (多参数的问题)
例如:要把http://localhost:8080/test/user/get.jsp?id=1&name=admin转换成
http://localhost:8080/test/get1_admin.html
在urlrewrite.xml中这样配置:
1 <rule>
2 <from>/get([0-9]+)_([a-z]+).html$</from>
3 <to>/user/get.jsp?id=$1&name=$2</to>
4 </rule>
//这里是用([a-z])+ 正则表达式表示所有的字母
用([0-9])+表示所有的数字
当请求/get1_admin.html这个页面时,实际上相当于请求/user/get.jsp?id=1&name=admin页面,在servlet的跳转要这样写(id,name为变量):
response.sendRedirect("./user/view/"+ id +"_"+ name +".html");
注意:配置文件中用"_"来代替"&"。
(个人认为这种伪静态化相对于action的形式是比较安全的,但是也加重了服务器的负载,也就是一次请求,先是静态的请求,然后对应的是一次转向,间接的加重了服务器的负荷)

配置文件

<?xml  version= "1.0"  encoding= "utf-8"?>
<!DOCTYPE  urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 2.6//EN"
        " [url ]http://tuckey.org/res/dtds/urlrewrite2.6.dtd [/url ]" >
<urlrewrite>
  <rule>
  <from>^/(\w+)/(\w+)/page_(\d+)\.html$</from>
  <to type="forward">/$1.htm?category=$2 &amp;page=$3</to>
 </rule>
  <rule>
     <from>^/rss/yahoo\.html$</from>
       <to type="redirect">    [url]http://add.my.yahoo.com/rss? url=http://feed.feedsky.com/W3CSSiteFeed[/url]
      </to>
 </rule>
</urlrewrite>

/(\w+)/(\w+)/page_(\d+).html//1.htm?category=2&page=2&page=3

简单的介绍一下常用的正规表示式:
代码 说明
. 匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线或汉字
\s 匹配任意的空白符
\d 匹配数字
\b 匹配单词的开始或结束
^ 匹配字符串的开始
匹配字符串的结束
常用的&要用 &来表示。匹配字符串的结束 常用的&要用 &来表示。1,$2代表与你配置正规表达式/(\w+)/(\w+)/相对应的参数。
默认的是 type=”forward”.
另一个常用的规则就是连接外部的网站。就要用到。


<!-- js文件定向至指定目录 -->
<rewrite url="^~/JS/([^\.]+).js$" to="~/JS/$1.js" processing="stop"/>

<!-- css文件定向至指定目录 -->
<rewrite url="^~/Style/([^\.]+).css$" to="~/Style/$1.css" processing="stop"/>

<!-- 将各个图像文件定向至指定目录,注意要给每个文件类型写一个规则 -->
<rewrite url="^~/Image/([^\.]+).gif$" to="~/Image/$1.gif" processing="stop"/>
<rewrite url="^~/Image/([^\.]+).jpg$" to="~/Image/$1.jpg" processing="stop"/>

<rewrite url="^~/Image/([^\.]+).ico$" to="~/Image/$1.ico" processing="stop"/>

7.获取多个返回值

 <package name="core" extends="json-default,jfreechart-default,jasperreports-default">

</package>

































  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值