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 -->
<groupId>org.apache.struts</groupId>
<artifactId>struts2-sitemesh-plugin</artifactId>
<version>2.3.34</version>
</dependency>
PS:这个过滤器一定要再struts2的过滤器的前面
<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>
1.新建一个文件的名称 decorators.xml
2.该配置文件必须放在WEB-INF目录下
3.配置文件的内容如下
<decorators>
</decorators>
我要把头部 和 底部给抽取出来 只要其中的内容部分
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中添加 允许后台调用前台的配置
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>
//允许当前页面上的函数 被后台所调用
dwr.engine.setActiveReverseAjax(true);
//当页面关闭时 通知服务器 去除当前的session
dwr.engine.setNotifyServerOnPageUnload(true);
</script>
下载 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的形式是比较安全的,但是也加重了服务器的负载,也就是一次请求,先是静态的请求,然后对应的是一次转向,间接的加重了服务器的负荷)
配置文件
<!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 &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>