﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-gjynewer-文章分类-ssh心得笔记</title><link>http://www.blogjava.net/gjynewer/category/45465.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 05 Jul 2010 05:16:24 GMT</lastBuildDate><pubDate>Mon, 05 Jul 2010 05:16:24 GMT</pubDate><ttl>60</ttl><item><title>spring-security安全管理</title><link>http://www.blogjava.net/gjynewer/articles/325124.html</link><dc:creator>gjy</dc:creator><author>gjy</author><pubDate>Sat, 03 Jul 2010 02:55:00 GMT</pubDate><guid>http://www.blogjava.net/gjynewer/articles/325124.html</guid><wfw:comment>http://www.blogjava.net/gjynewer/comments/325124.html</wfw:comment><comments>http://www.blogjava.net/gjynewer/articles/325124.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gjynewer/comments/commentRss/325124.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gjynewer/services/trackbacks/325124.html</trackback:ping><description><![CDATA[<p>安全管理 -Spring-Security<br />
简单例子：<br />
1：加入spring-Securtiy 的jar包<br />
2：在web.xml中配置<br />
&lt;filter&gt;<br />
&nbsp;&lt;filter-name&gt;springSecurityFilterChain&lt;/filter-name&gt;<br />
&nbsp;&lt;filter-class&gt;org.springframework.web.filter.DelegatingFilterProxy&lt;/filter-class&gt;<br />
&lt;/filter&gt;<br />
&lt;filter-mapping&gt;<br />
&nbsp;&lt;filter-name&gt;springSecurityFilterChain&lt;/filter-name&gt;<br />
&nbsp;&lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />
&lt;/filter-mapping&gt;<br />
3：修改applicationContext-security.xml如下<br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt;</p>
<p>&lt;beans xmlns="http://www.springframework.org/schema/beans"<br />
&nbsp;&nbsp;&nbsp; xmlns:ss="http://www.springframework.org/schema/security"<br />
&nbsp;&nbsp;&nbsp; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br />
&nbsp;&nbsp;&nbsp; xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.1.xsd"&gt;</p>
<p>&nbsp;&lt;!--最简单配置--&gt;<br />
&nbsp;&lt;ss:http auto-config="true"&gt;<br />
&nbsp;&nbsp;url拦截信息&nbsp;&nbsp; /** 所有的<br />
&nbsp;&nbsp;&lt;ss:intercept-url pattern="/**" access="ROLE_ADMIN"/&gt;<br />
&nbsp;&lt;/ss:http&gt;<br />
&nbsp;&lt;ss:authentication-provider&gt; <br />
&nbsp;&nbsp; &lt;ss:user-service&gt; 用户的认证&nbsp; authorities 权限<br />
&nbsp;&nbsp;&lt;ss:user password="admin" name="admin" authorities="ROLE_ADMIN"/&gt;<br />
&nbsp;&nbsp;&lt;!--在第5步完成后添加一个用户试验 --&gt;<br />
&nbsp;&nbsp;输入用户名user，密码user 会出现403 访问拒绝的错误，原因是<br />
&nbsp;&nbsp;权限ROLE_USER 在ss:intercept-url 没有拦截任何url<br />
&nbsp;&nbsp;如果修改上面如下：&lt;ss:intercept-url pattern="/**" access="ROLE_ADMIN,ROLE_USER"/&gt;<br />
&nbsp;&nbsp;就没有问题<br />
&nbsp;&nbsp;&lt;ss:user password="user" name="user" authorities="ROLE_USER"/&gt;<br />
&nbsp;&nbsp; &lt;/ss:user-service&gt;<br />
&nbsp;&lt;/ss:authentication-provider&gt;<br />
&lt;/beans&gt;</p>
<p>4:启动项目<br />
5：http://localhost:8080/fpm/回车<br />
&nbsp; 会自动出现一个spring-security的一个登录界面(自动生产的登录界面)<br />
&nbsp; 输入admin 和admin 就可以进入，否则会提示错误信息<br />
6:登录界面是系统给的。接下来是一个自定义的登录界面 <br />
&lt;%@ page contentType="text/html;charset=UTF-8"%&gt;<br />
&lt;%@ include file="/common/taglibs.jsp"%&gt;</p>
<p><br />
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;<br />
&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;<br />
&lt;head&gt;<br />
&nbsp;&lt;title&gt;FPM -- 管理系统&lt;/title&gt;<br />
&nbsp;&lt;%@ include file="/common/metas.jsp"%&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&nbsp;action,name 用spring-security的固定格式<br />
&nbsp; &lt;form name="loginForm" action="${path}/j_spring_security_check" method="POST"&gt;<br />
&nbsp;&lt;table&gt;<br />
&nbsp;&lt;tr&gt;<br />
&nbsp;&nbsp;&lt;td&gt;用户名：&lt;/td&gt;<br />
&nbsp;&nbsp;&lt;td&gt;&lt;input type="text" name="j_username"/&gt;&lt;/td&gt;<br />
&nbsp;&lt;/tr&gt;<br />
&nbsp;&lt;tr&gt;<br />
&nbsp;&nbsp;&lt;td&gt;密码：&lt;/td&gt;<br />
&nbsp;&nbsp;&lt;td&gt;&lt;input type="password" name="j_password"/&gt;&lt;/td&gt;<br />
&nbsp;&lt;/tr&gt;<br />
&nbsp;&lt;tr&gt;<br />
&nbsp;&nbsp;&lt;td colspan="2"&gt;<br />
&nbsp;&nbsp;&lt;input type="submit" value="登录"/&gt;&lt;/td&gt;<br />
&nbsp;&lt;/tr&gt;<br />
&nbsp;&lt;/table&gt;<br />
&nbsp; &lt;/form&gt;<br />
&lt;/body&gt;</p>
<p>7:修改applicationContext-security.xml如下<br />
&nbsp; 在&lt;ss:http auto-config="true"&gt;中增加如下代码<br />
&nbsp; &lt;ss:form-login<br />
&nbsp;login-page="登录页面"<br />
&nbsp;authentication-failure-url="登录失败页面"<br />
&nbsp;default-target-url="登录成功的页面"<br />
&nbsp;/&gt;<br />
8：启动项目，输入http://localhost:8080/fpm/&nbsp; 发现进去不了<br />
&nbsp;&nbsp; 原因是：web.xml中的过滤器拦截了这个，然后跳转到form-login中的login-page中<br />
&nbsp; 但是login-page 又被拦截，所以限入了死循环了<br />
&nbsp; 在这句前面加上&lt;ss:intercept-url pattern="/**" access="ROLE_ADMIN"/&gt;<br />
&nbsp; &lt;ss:intercept-url pattern="登录页面" filters="none"/&gt; 表示登录页面不被过滤</p>
<p>9:怎么用数据库去存储用户，密码（这都是spring-security的默认方式）<br />
&nbsp;create table users( --用户表<br />
&nbsp;&nbsp;&nbsp; username varchar2(50) not null,<br />
&nbsp;&nbsp;&nbsp; password varchar2(50) not null,<br />
&nbsp;&nbsp;&nbsp; enabled char(1) not null --当前用户是否可用 boolean 也可以<br />
);</p>
<p>create table authorities ( --权限表<br />
&nbsp;&nbsp;&nbsp; username varchar2(50) not null, --用户<br />
&nbsp;&nbsp;&nbsp; authority varchar2(50) not null --权限<br />
);</p>
<p>insert into users(username,password,enabled) values('admin','admin','1');<br />
insert into users(username,password,enabled) values('user','user','1');</p>
<p>insert into authorities(username,authority) values('admin','ROLE_ADMIN');<br />
insert into authorities(username,authority) values('admin','ROLE_USER');<br />
insert into authorities(username,authority) values('user','ROLE_USER');</p>
<p>10:修改applicationContext-security.xml如下<br />
&nbsp; 先禁止&lt;ss:authentication-provider&gt; 然后添加如下<br />
&nbsp;&lt;ss:authentication-provider&gt; <br />
&nbsp;&lt;ss:jdbc-user-service data-source-ref="spring中数据源名字"/&gt;<br />
&nbsp;&lt;/ss:authentication-provider&gt; </p>
<p>11:运行项目 访问数据库中的用户 也可以。<br />
12：修改applicationContext-security.xml如下<br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt;</p>
<p>&lt;beans xmlns="http://www.springframework.org/schema/beans"<br />
&nbsp;&nbsp;&nbsp; xmlns:ss="http://www.springframework.org/schema/security"<br />
&nbsp;&nbsp;&nbsp; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br />
&nbsp;&nbsp;&nbsp; xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.1.xsd"&gt;</p>
<p>&nbsp;&lt;ss:http auto-config="true"&gt;<br />
&nbsp;&nbsp;&lt;ss:intercept-url pattern="/common/**" filters="none"/&gt;<br />
&nbsp;&nbsp;&lt;ss:intercept-url pattern="/css/**" filters="none"/&gt;<br />
&nbsp;&nbsp;&lt;ss:intercept-url pattern="/images/**" filters="none"/&gt;<br />
&nbsp;&nbsp;&lt;ss:intercept-url pattern="/js/**" filters="none"/&gt;<br />
&nbsp;&nbsp;IS_AUTHENTICATED_ANONYMOUSLY 表示匿名权限，所有匿名都来login.action中<br />
&nbsp;&nbsp;&lt;ss:intercept-url pattern="/login.action" access="IS_AUTHENTICATED_ANONYMOUSLY"/&gt;<br />
&nbsp;&nbsp;&lt;ss:intercept-url pattern="/company/company.action" access="ROLE_ADMIN"/&gt;<br />
&nbsp;&nbsp;&lt;ss:intercept-url pattern="/dept/dept.action" access="ROLE_USER"/&gt;<br />
&nbsp;&nbsp;IS_AUTHENTICATED_FULLY 默认权限，只要登录就可以访问（不管是admin还是其他权限）<br />
&nbsp;&nbsp;&lt;ss:intercept-url pattern="/**" access="IS_AUTHENTICATED_FULLY"/&gt;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;&lt;ss:form-login<br />
&nbsp;&nbsp;&nbsp;login-page="/login.action"<br />
&nbsp;&nbsp;&nbsp;authentication-failure-url="/login.action?error=true"<br />
&nbsp;&nbsp;&nbsp;default-target-url="/"<br />
&nbsp;&nbsp;/&gt;<br />
&nbsp;&nbsp;<br />
&nbsp;&lt;/ss:http&gt;<br />
&nbsp;<br />
&nbsp;&lt;!--&lt;ss:authentication-provider&gt;<br />
&nbsp;&nbsp;&lt;ss:user-service&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;ss:user password="admin" name="admin" authorities="ROLE_ADMIN,ROLE_USER"/&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;ss:user password="user" name="user" authorities="ROLE_USER"/&gt;<br />
&nbsp;&nbsp;&lt;/ss:user-service&gt;<br />
&nbsp;&lt;/ss:authentication-provider&gt;</p>
<p>--&gt;</p>
<p>&nbsp;&lt;ss:authentication-provider&gt;<br />
&nbsp;&nbsp;&lt;ss:jdbc-user-service data-source-ref="dataSource"/&gt;<br />
&nbsp;&lt;/ss:authentication-provider&gt;</p>
<p>&lt;/beans&gt;</p>
<p>13:前面的都是默认的数据库<br />
自定义数据库用户权限管理</p>
<p>&nbsp;create table test_users( --用户表<br />
&nbsp;&nbsp;&nbsp; id varchar2(100) not null primary key,<br />
&nbsp;&nbsp;&nbsp; username varchar2(200) not null,<br />
&nbsp;&nbsp;&nbsp; password varchar2(200) not null,<br />
&nbsp;&nbsp;&nbsp; enabled char(1) not null --当前用户是否可用 boolean 也可以<br />
);<br />
数据为<br />
1&nbsp; admin admin 1<br />
2&nbsp; user user&nbsp;&nbsp; 1<br />
create table test_role(<br />
&nbsp;id varchar2(100) not null primary key,<br />
&nbsp;role_name&nbsp; varchar2(100) not null<br />
)<br />
数据为<br />
1&nbsp; ROLE_ADMIN<br />
2&nbsp; ROLE_USER<br />
create table test_user_role(<br />
&nbsp; user_id varchar2(100),<br />
&nbsp; role_id varchar2(100)<br />
)<br />
数据为<br />
1&nbsp;1<br />
1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2<br />
2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2</p>
<p>修改applicaitonContext-security.xml<br />
&lt;ss:authentication-provider&gt;<br />
&nbsp;&nbsp;&lt;ss:password-encoder hash="md5"/&gt;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;&lt;ss:jdbc-user-service data-source-ref="dataSource"<br />
&nbsp;&nbsp;users-by-username-query="select username,password,enabled from test_user where username = ?"<br />
&nbsp;&nbsp;authorities-by-username-query="select u.username,r.role_name authority from test_user u<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; join test_user_role ur on ur.user_id = u.id<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; join test_role r on ur.role_id = r.id<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; where u.username = ?"/&gt;<br />
&nbsp;&lt;/ss:authentication-provider&gt;</p>
<p>users-by-username-query:由用户名查询出用户<br />
authorities-by-username-query：由用户名查询出权限</p>
<p><br />
14:对数据加密(md5)<br />
</p>
<img src ="http://www.blogjava.net/gjynewer/aggbug/325124.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gjynewer/" target="_blank">gjy</a> 2010-07-03 10:55 <a href="http://www.blogjava.net/gjynewer/articles/325124.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts2整合JFreeChart</title><link>http://www.blogjava.net/gjynewer/articles/324991.html</link><dc:creator>gjy</dc:creator><author>gjy</author><pubDate>Thu, 01 Jul 2010 07:52:00 GMT</pubDate><guid>http://www.blogjava.net/gjynewer/articles/324991.html</guid><wfw:comment>http://www.blogjava.net/gjynewer/comments/324991.html</wfw:comment><comments>http://www.blogjava.net/gjynewer/articles/324991.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gjynewer/comments/commentRss/324991.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gjynewer/services/trackbacks/324991.html</trackback:ping><description><![CDATA[<p>JFreeChart 是一个非常流行的一个免费开源的图表软件<br />
已经有8年以上的历史</p>
<p>首先要下载jar包<br />
www.jfree.org</p>
<p>在http://www.jfree.org/jfreechart 下点击Project Page at SourceForge 去下载<br />
要下载JFreeChart 与JCommon</p>
<p>把jfreechart-1.0.9.jar与jcommon-1.0.12.jar加入到系统中</p>
<p>做JFreeChart的时候，一般是以下三步<br />
1：要有数据 比如DefaultPieDataset<br />
2：根据数据生成 JFreeChart 对象<br />
3：显示JFreeChart对象（显示在swing中或生成一个图片在jsp中显示）</p>
<p><br />
一：体验下JFreeChart的强大功能(读javadoc文档 一个最重要的类JFreeChart)<br />
&nbsp;package com.test.jfreechart<br />
&nbsp;public class JFreeChartTest{<br />
&nbsp;public static void main(String []args){<br />
&nbsp;&nbsp;//首先要有数据(Dataset数据集)<br />
&nbsp;&nbsp;DefaultPieDataset dpd=new DefaultPieDataset();<br />
&nbsp;&nbsp;//setValue(Comparable key ,double value);<br />
&nbsp;&nbsp;//字符串实现了Comparable接口<br />
&nbsp;&nbsp;dpd.setValue("管理人员",25);<br />
&nbsp;&nbsp;dpd.setValue("市场人员",25);<br />
&nbsp;&nbsp;dpd.setValue("开发人员",45);<br />
&nbsp;&nbsp;dpd.setValue("其他人员",10);<br />
&nbsp;&nbsp;//然后把数据放入到JFreeChart 中<br />
&nbsp;&nbsp;//创建一个平面图形<br />
&nbsp;&nbsp;JFreeChart chart=CharFactory.createPieChart("某公司人员组织结构图",dbp,true,false,false);<br />
&nbsp;&nbsp;&nbsp;&nbsp; //JFreeChart chart=CharFactory.createPieChart3D("某公司人员组织结构图",dbp,true,false,false);<br />
&nbsp;&nbsp;//通过swing显示出来<br />
&nbsp;&nbsp;ChartFrame frame=new ChartFrame("标题",chart);<br />
&nbsp;&nbsp;frame.pack();<br />
&nbsp;&nbsp;frame.setVisible(true);<br />
&nbsp;}<br />
&nbsp;}</p>
<p>&nbsp; 上面会显示一个饼状图，一般来说，图形有3部分组成<br />
&nbsp;&nbsp; 1：标题<br />
&nbsp;&nbsp; 2：中间的图形（叫plot）<br />
&nbsp;&nbsp; 3：底部有个说明什么颜色表示什么数据(legend)<br />
package com.test.jfreechart<br />
//ApplicationFrame 是属于Jcommon中的<br />
&nbsp;public class JFreeChartTest2 extends ApplicationFrame{ 柱状图<br />
&nbsp;public JFreeChartTest2(String title)<br />
&nbsp;{<br />
&nbsp;&nbsp;super(title);</p>
<p>&nbsp;&nbsp;this.setContentPane(createPanel());<br />
&nbsp;}</p>
<p>&nbsp;public static CategoryDataset createDataset()<br />
&nbsp;{<br />
&nbsp;&nbsp;//默认柱状图数据集&nbsp; Category(柱状)<br />
&nbsp;&nbsp;DefaultCategoryDataset dataset = new DefaultCategoryDataset();<br />
&nbsp;&nbsp;//setValue(double value,Comparable rowKey,Comparable columnKey)<br />
&nbsp;&nbsp;dataset.setValue(10, "aa", "管理人员");<br />
&nbsp;&nbsp;dataset.setValue(20, "bb", "市场人员");<br />
&nbsp;&nbsp;dataset.setValue(40, "cc", "开发人员");<br />
&nbsp;&nbsp;dataset.setValue(15, "dd", "其他人员");</p>
<p>&nbsp;&nbsp;return dataset;<br />
&nbsp;}</p>
<p>&nbsp;//把数据加到chart 图表中<br />
&nbsp;public static JFreeChart createChart(CategoryDataset dataset)<br />
&nbsp;{<br />
&nbsp;&nbsp;JFreeChart chart = ChartFactory.createBarChart3D("hello", "人员分布", "人员数量",<br />
&nbsp;&nbsp;&nbsp;&nbsp;dataset, PlotOrientation.VERTICAL, true, false, false);</p>
<p>&nbsp;&nbsp;chart.setTitle(new TextTitle("某公司组织结构图", new Font("宋体", Font.BOLD<br />
&nbsp;&nbsp;&nbsp;&nbsp;+ Font.ITALIC, 20)));</p>
<p>&nbsp;&nbsp;CategoryPlot plot = (CategoryPlot) chart.getPlot();</p>
<p>&nbsp;&nbsp;CategoryAxis categoryAxis = plot.getDomainAxis();</p>
<p>&nbsp;&nbsp;categoryAxis.setLabelFont(new Font("微软雅黑", Font.BOLD, 12));</p>
<p>&nbsp;&nbsp;return chart;</p>
<p>&nbsp;}<br />
&nbsp;public static JPanel createPanel()<br />
&nbsp;{<br />
&nbsp;&nbsp;JFreeChart chart = createChart(createDataset());</p>
<p>&nbsp;&nbsp;return new ChartPanel(chart);<br />
&nbsp;}</p>
<p>&nbsp;public static void main(String[] args)<br />
&nbsp;{<br />
&nbsp;&nbsp;JFreeChartTest2 chart = new JFreeChartTest2("某公司组织结构图");</p>
<p>&nbsp;&nbsp;chart.pack();<br />
&nbsp;&nbsp;chart.setVisible(true);<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;}</p>
<p>二：上面都是在swing中生成的图形，我们在web程序里面怎么做呢<br />
&nbsp; 下面把JFreeChart 生成一个图片，那么在web程序中就可以调用这个图片了<br />
&nbsp; public class JFreeChartTest3<br />
{<br />
&nbsp;public static void main(String[] args) throws Exception<br />
&nbsp;{<br />
&nbsp;&nbsp;JFreeChart chart = ChartFactory.createPieChart("某公司组织结构图",<br />
&nbsp;&nbsp;&nbsp;&nbsp;getDataset(), true, false, false);</p>
<p>&nbsp;&nbsp;chart.setTitle(new TextTitle("某公司组织结构图", new Font("宋体", Font.BOLD,22)));</p>
<p>&nbsp;&nbsp;LegendTitle legend = chart.getLegend(0);</p>
<p>&nbsp;&nbsp;legend.setItemFont(new Font("微软雅黑", Font.BOLD, 14));</p>
<p>&nbsp;&nbsp;PiePlot plot = (PiePlot) chart.getPlot();</p>
<p>&nbsp;&nbsp;plot.setLabelFont(new Font("隶书", Font.BOLD, 16));</p>
<p>&nbsp;&nbsp;//通过输出流把图形 创建为一个图片<br />
&nbsp;&nbsp;OutputStream os = new FileOutputStream("company.jpeg");<br />
&nbsp;&nbsp;//将chart 输出到os中，宽为1000，高为800<br />
&nbsp;&nbsp;ChartUtilities.writeChartAsJPEG(os, chart, 1000, 800);</p>
<p>&nbsp;&nbsp;os.close();</p>
<p>&nbsp;}</p>
<p>&nbsp;private static DefaultPieDataset getDataset()<br />
&nbsp;{<br />
&nbsp;&nbsp;DefaultPieDataset dpd = new DefaultPieDataset();</p>
<p>&nbsp;&nbsp;dpd.setValue("管理人员", 25);<br />
&nbsp;&nbsp;dpd.setValue("市场人员", 25);<br />
&nbsp;&nbsp;dpd.setValue("开发人员", 45);<br />
&nbsp;&nbsp;dpd.setValue("其他人员", 10);</p>
<p>&nbsp;&nbsp;return dpd;<br />
&nbsp;}</p>
<p>}</p>
<p>三：如何在jsp中显示JFreeChart生成的图片</p>
<p>org.jfree.chart.servlet.DisplayChart<br />
这是一个servlet，这个Servlet会作为一个流把图片输出到客户端<br />
要使用DisplayChart 那么在web.xml中必须配置如下代码<br />
&nbsp;&lt;servlet&gt;<br />
&nbsp;&nbsp;&lt;servlet-name&gt;DisplayChart&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&lt;servlet-class&gt;<br />
&nbsp;&nbsp;&nbsp;org.jfree.chart.servlet.DisplayChart<br />
&nbsp;&nbsp;&lt;/servlet-class&gt;<br />
&nbsp;&lt;/servlet&gt;<br />
&nbsp;&lt;servlet-mapping&gt;<br />
&nbsp;&nbsp;&lt;servlet-name&gt;DisplayChart&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&lt;url-pattern&gt;/DisplayChart&lt;/url-pattern&gt;<br />
&nbsp;&lt;/servlet-mapping&gt;</p>
<p>&nbsp; &lt;%@ page language="java" contentType="text/html; charset=GB18030"<br />
&nbsp;&nbsp;&nbsp; pageEncoding="GB18030"%&gt;<br />
&nbsp;&nbsp;&nbsp; <br />
&lt;%@ page import="org.jfree.data.general.DefaultPieDataset,org.jfree.chart.ChartFactory<br />
,org.jfree.chart.JFreeChart,org.jfree.chart.servlet.*" %&gt;<br />
&nbsp;&nbsp;&nbsp; <br />
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&gt;<br />
&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;meta http-equiv="Content-Type" content="text/html; charset=GB18030"&gt;<br />
&lt;title&gt;Insert title here&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;</p>
<p>&lt;%</p>
<p>DefaultPieDataset dpd = new DefaultPieDataset();</p>
<p>dpd.setValue("管理人员", 25);<br />
dpd.setValue("市场人员", 25);<br />
dpd.setValue("开发人员", 45);<br />
dpd.setValue("其他人员", 10);</p>
<p>JFreeChart chart = ChartFactory.createPieChart3D("某公司组织结构图",dpd, true, false, false);<br />
//ServletUtilities 能帮助生成图片对象<br />
String fileName = ServletUtilities.saveChartAsPNG(chart,800,600,session);</p>
<p>String url = request.getContextPath() + "/DisplayChart?filename=" + fileName;</p>
<p>%&gt;</p>
<p>&lt;img src="&lt;%= url %&gt;" width="800" height="600"&gt;</p>
<p><br />
&lt;/body&gt;<br />
&lt;/html&gt;</p>
<p>四：要通过Struts2整合JFreeChart ，可以学到Struts2整合其他插件的通用方法<br />
怎么通过Struts2整合JFreeChart<br />
通过用户投票这个例子达到整合<br />
select.jsp<br />
&lt;h1&gt;请选择喜欢的运动项目&lt;/h1&gt;<br />
&lt;s:form action="viewResult"&gt;<br />
&nbsp;&lt;s:checkbox name="interest" label="足球"&gt;&lt;/s:checkbox&gt;<br />
&nbsp;&lt;s:checkbox name="interest" label="篮球"&gt;&lt;/s:checkbox&gt;<br />
&nbsp;&lt;s:checkbox name="interest" label="排球"&gt;&lt;/s:checkbox&gt;<br />
&nbsp;&lt;s:checkbox name="interest" label="羽毛球"&gt;&lt;/s:checkbox&gt;<br />
&lt;/s:form&gt;<br />
上面的方式，显示的时候所有的value都为true 这显然不行的。<br />
不可能提交的表单都为true的,修改如下<br />
&lt;h1&gt;请选择喜欢的运动项目&lt;/h1&gt;<br />
&lt;s:form action="viewResult"&gt;<br />
&nbsp;&lt;s:checkbox name="interest" label="足球" fieldValue="football"&gt;&lt;/s:checkbox&gt;<br />
&nbsp;&lt;s:checkbox name="interest" label="篮球" fieldValue="basktball"&gt;&lt;/s:checkbox&gt;<br />
&nbsp;&lt;s:checkbox name="interest" label="排球" fieldValue="volleytball"&gt;&lt;/s:checkbox&gt;<br />
&nbsp;&lt;s:checkbox name="interest" label="羽毛球" fieldValue="badminton"&gt;&lt;/s:checkbox&gt;</p>
<p>&nbsp; &lt;!--&lt;s:checkboxlist list="#{'computer':'计算机','math':'数学'}"&gt; name="interest" label="阳光" labelPosition="top"&gt;&lt;/s:checkboxlist&gt;<br />
--&gt;<br />
&nbsp;&lt;s:submit value="提交"/&gt;<br />
&lt;/s:form&gt;</p>
<p>&lt;s:checkbox&gt;与&lt;s:checkboxlist&gt;这2个标签都是复选框，推荐使用s:checkbox</p>
<p>//要把struts2-jfreechart-plugin.jar复制到系统中</p>
<p>ViewResult这个Action的作用就是<br />
首先把复选框中的数据加入到interest这个List中<br />
然后把这个数据放到chart这个对象中<br />
然后把chart对象交给JFreechart-plugin插件显示输出</p>
<p><br />
这个action执行的时候，会执行execute方法<br />
返回SUCCESS<br />
这是的结果类型为chart，那么jfreechart-plugin这个插件会自动<br />
调用action中的getChart方法，并显示出来</p>
<p>package com.test.action;<br />
public class ViewResultAction extends ActionSupport{<br />
&nbsp; private JFreeChart chart;//chart变量不能随便改的<br />
&nbsp; //chart的setters getters方法<br />
&nbsp; public JFreeChart getChart(){<br />
&nbsp;chart=ChartFactory.createBarChart("兴趣统计结果","项目","结果",getDataset(),PlotOrientation.VERTICAL,false,false,false);<br />
&nbsp;chart.setTitle(new TextTitle("兴趣统计结果",new Font("黑体",Font.BOLD,22)));<br />
&nbsp;CategoryPlot plot=(CategoryPlot)chart.getPlot();<br />
&nbsp;CategoryAxis axis=plot.getDomainAxis();//x坐标<br />
&nbsp;axis.setLabelFont(new Font("宋体",Font.BOLD,22));<br />
&nbsp;axis.setCategoryLabelPositionOffset(CategoryLabelPositions.UP_45);//字体的倾斜度<br />
&nbsp;<br />
&nbsp;return chart;<br />
&nbsp; }<br />
&nbsp; //获得表单数据<br />
&nbsp; private List&lt;String&gt; interest;//自动把复选框的值设置到List中<br />
&nbsp; //getters,setters方法<br />
&nbsp; public String execute() throws Exception{<br />
&nbsp;//从struts.apache.org中找到<br />
&nbsp;//jfreechart-plugin<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //jfreechart-plugin这个插件 能够把chart对象(自动调用getChart()方法)生成到客户端并能够显示<br />
&nbsp;//不会我们去写代码生成图片显示了&nbsp;<br />
&nbsp;return SUCCESS;<br />
&nbsp; }</p>
<p>&nbsp; //把list客户端的复选框的值保存到application中<br />
&nbsp; private void increaseResult(List&lt;String&gt; list){<br />
&nbsp;ActionContext context=ActionContext.getContext();<br />
&nbsp;Map map=context.getApplication();//获得application对象<br />
&nbsp;//application对象中保存投票的结果 模拟<br />
&nbsp;for(String str:list){<br />
&nbsp; if(null==map.get(str)){//第一次投票<br />
&nbsp;&nbsp;map.put(str,1);<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; else{//表示这个选项不是第一次投票<br />
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;map.put(str,(Integer)map.get(str)+1);<br />
&nbsp;&nbsp; }<br />
&nbsp;}<br />
&nbsp; }<br />
&nbsp; private CategoryDataset getDataset(){//产生柱状图的数据<br />
&nbsp;DefaultCategoryDataset dataset=new DefaultCategoryDataset();<br />
&nbsp;increaseResult(this.getInterest());//把数据更新到application中<br />
&nbsp;ActionContext context=ActionContext.getContext();<br />
&nbsp;Map map=context.getApplication();<br />
&nbsp;//把application中的数据放到dataset中<br />
&nbsp;dataset.setValue((Integer)map.get("football"),"","足球");<br />
&nbsp;dataset.setValue((Integer)map.get("basketball"),"","蓝球");<br />
&nbsp;dataset.setValue((Integer)map.get("volleyball"),"","排球");<br />
&nbsp;dataset.setValue((Integer)map.get("badminton"),"","羽毛球");<br />
&nbsp;return dataset;<br />
&nbsp; }<br />
}<br />
把jfreechart-plugin的jar包解压缩<br />
修改struts-plugin.xml中<br />
把&lt;package name="jfreechart-default"&gt;<br />
修改为<br />
&lt;package name="jfreechart-default" extends="struts-default"&gt;<br />
然后把jfreechart-plugin的jar包重新打包<br />
jar cvf struts2-jfreechart-plugin-版本号.jar&nbsp; -C<br />
生成后重新放到系统中</p>
<p>在struts.xml中进行配置<br />
修改如下<br />
&lt;package name="struts2" extends="jfreechart-default"&gt; <br />
&lt;action name="viewResult" class="com.test.action.ViewResultAction"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;result name="success" type="chart"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;param name="height"&gt;600&lt;/param&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&lt;param name="width"&gt;800&lt;/param&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;/result&gt;<br />
&lt;/action&gt;</p>
<p><br />
这样 运行项目 就会显示结果了</p>
<img src ="http://www.blogjava.net/gjynewer/aggbug/324991.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gjynewer/" target="_blank">gjy</a> 2010-07-01 15:52 <a href="http://www.blogjava.net/gjynewer/articles/324991.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2+Hibernate3.2+Spring2.0整合</title><link>http://www.blogjava.net/gjynewer/articles/324913.html</link><dc:creator>gjy</dc:creator><author>gjy</author><pubDate>Wed, 30 Jun 2010 09:22:00 GMT</pubDate><guid>http://www.blogjava.net/gjynewer/articles/324913.html</guid><wfw:comment>http://www.blogjava.net/gjynewer/comments/324913.html</wfw:comment><comments>http://www.blogjava.net/gjynewer/articles/324913.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gjynewer/comments/commentRss/324913.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gjynewer/services/trackbacks/324913.html</trackback:ping><description><![CDATA[<p>1:添加hibernate3.2的支持<br />
选择hibernate3.2 Annotations 和core Libraries的勾打上<br />
&nbsp; hibernate.cfg.xml放到src下<br />
去掉勾 specify database connection details 交给spring去管理<br />
去掉勾 create SessionFactory class</p>
<p>2：添加Spring2.0的支持<br />
添加如下前4个jar文件和1个<br />
&nbsp; AOP， Core， Persistence Core，Persistence jdbc<br />
&nbsp; Spring2.0 Web Libraries<br />
WEB-INF下生成一个applicationContext.xml<br />
去掉勾 create Spring SessionFactory that references</p>
<p>3：添加struts2的支持<br />
&nbsp; src下放struts.xml文件<br />
&nbsp; <br />
4:创建一个users表<br />
自动有id firstname lastname age；</p>
<p>5：index.jsp <br />
&lt;s:a href="save.jsp"&gt;save user&lt;/s:a&gt;&lt;br/&gt;</p>
<p>&lt;s:a href="listUser.action"&gt;List User&lt;/s:a&gt;&lt;br/&gt;</p>
<p>6:save.jsp(可以考虑国际化)<br />
&lt;s:form action="saveUser"&gt;<br />
&nbsp;&lt;s:textfield name="user.firstname" label="firstname"&gt;&lt;/s:textfield&gt;<br />
&nbsp;&lt;s:textfield name="user.lastname" label="lastname"&gt;&lt;/s:textfield&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:textfield name="user.age" label="age"&gt;&lt;/s:textfield&gt;<br />
&nbsp;&lt;s:submit&gt;&lt;/s:submit&gt;<br />
&lt;/s:form&gt;</p>
<p>7:package com.test.bean <br />
public class User{<br />
&nbsp; private Integer id;<br />
&nbsp; private String firstname;<br />
&nbsp; private String lastname;<br />
&nbsp; private int age;<br />
}<br />
建立User.hbm.xml文件<br />
&lt;hibernate-mapping&gt;<br />
&nbsp;&lt;class name="com.test.bean.User" tables="users"&gt;<br />
&nbsp;&nbsp; &lt;id name="id" type="java.lang.Integer" column="id"&gt;<br />
&nbsp;&lt;generator class="increment"&gt;&lt;/generator&gt;<br />
&nbsp;&nbsp; &lt;/id&gt;<br />
&nbsp;&nbsp; &lt;property name="firstname" type="string" length="50"/&gt;<br />
&nbsp;&nbsp; &lt;property name="lastname" type="string" length="50"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;property name="age" type="java.lang.Integer"/&gt;<br />
&nbsp;&lt;/class&gt;<br />
&lt;/hibernate-mapping&gt;</p>
<p><br />
8:com.test.action.user<br />
public class SaveUserAction extends ActionSupport implements ModelDriven{<br />
&nbsp; private User user=new User();<br />
&nbsp; //生成getters,setters方法<br />
&nbsp; public String execute() throws Exception{<br />
&nbsp;<br />
&nbsp; }<br />
}</p>
<p>9:save.jsp添加国际化支持<br />
&nbsp;src下建立一个struts.properties,内容如下<br />
#国际化资源文件的前缀 globalMessages<br />
&nbsp;struts.custom.i18n.resources=globalMessages <br />
定义2个国际化文件<br />
&nbsp;src下新建globalMessages_en.properties 英文的国际化文件<br />
&nbsp; firstname=firstname<br />
&nbsp; lastname=lastname<br />
&nbsp; age=age<br />
src下新建globalMessages_zh.properties 中文的国际化文件<br />
&nbsp;firstname=姓的ascii<br />
&nbsp; lastname=名的ascii<br />
&nbsp; age=年龄的ascii<br />
&nbsp;然后修改save.jsp(getText方法可以得到国际化文件中的值)<br />
&nbsp;&lt;s:form action="saveUser"&gt;<br />
&nbsp;&lt;s:textfield name="user.firstname" label="%{getText('firstname'}"&gt;&lt;/s:textfield&gt;<br />
&nbsp;&lt;s:textfield name="user.lastname" label="%{getText('lastname'}"&gt;&lt;/s:textfield&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:textfield name="user.age" label="%{getText('age'}"&gt;&lt;/s:textfield&gt;<br />
&nbsp;&lt;s:submit&gt;&lt;/s:submit&gt;<br />
&lt;/s:form&gt;<br />
&nbsp;重新启动项目，看看国际化起不起作用</p>
<p><br />
10:SaveUserAction 中要调用业务层的保存方法，业务层的保存方法要调用数据层<br />
&nbsp;所以要写业务层与数据访问层的代码</p>
<p>11:package com.test.dao<br />
&nbsp;&nbsp; public interface UserDAO{<br />
&nbsp;public void saveUser(User user);<br />
&nbsp;public viod removeUser(User user);<br />
&nbsp;public User findUserById(Integer id);<br />
&nbsp;public List&lt;User&gt; findAllUsers();&nbsp;&nbsp;&nbsp; <br />
&nbsp;public void updateUser(User user);<br />
}</p>
<p>12:package com.test.dao.impl//(没有使用事务，因为就操作数据库一次)<br />
public class UserDAOImpl extends HibernateDaoSupport implements UserDAO{<br />
&nbsp;public void saveUser(User user){<br />
&nbsp;&nbsp; this.getHibernateTemplate().save(user);<br />
&nbsp;}<br />
&nbsp;public viod removeUser(User user){<br />
&nbsp;&nbsp; this.getHibernateTemplate().delete(user);<br />
&nbsp;}<br />
&nbsp;public User findUserById(Integer id){<br />
&nbsp;&nbsp; User user=(User)this.getHibernateTemplate().get(User.class,id);<br />
&nbsp;&nbsp; return user;<br />
&nbsp;}<br />
&nbsp;@SuppressWarnings("unchecked")<br />
&nbsp;public List&lt;User&gt; findAllUsers(){<br />
&nbsp;&nbsp; String hql="from User user order by user.id desc";<br />
&nbsp;&nbsp; return (List&lt;User&gt;)this.getHibernateTemplate().find(hql);<br />
&nbsp;}&nbsp;&nbsp;&nbsp; <br />
&nbsp;public void updateUser(User user){<br />
&nbsp;&nbsp; this.getHibernateTemplate().update(user);<br />
&nbsp;}<br />
}</p>
<p><br />
13:package com.test.service<br />
&nbsp;&nbsp; public interface UserService{<br />
&nbsp;&nbsp; &nbsp;public void save(User user);<br />
&nbsp;public viod delete(User user);<br />
&nbsp;public User findById(Integer id);<br />
&nbsp;public List&lt;User&gt; findAll();&nbsp;&nbsp;&nbsp; <br />
&nbsp;public void update(User user);<br />
}</p>
<p>14:package com.test.service.impl<br />
&nbsp; public class UserServiceImpl implements UserService{<br />
&nbsp;private UserDAO userDao;//生成setters方法<br />
&nbsp;public void save(User user){<br />
&nbsp;&nbsp; userDao.saveUser(user);//在saveUser方法上ctrl+t<br />
&nbsp;}<br />
&nbsp;public viod delete(User user){<br />
&nbsp;&nbsp; this.userDao.removeUser(user);<br />
&nbsp;}<br />
&nbsp;public User findById(Integer id){<br />
&nbsp;&nbsp; return userDao.findUserById(id);<br />
&nbsp;}<br />
&nbsp;public List&lt;User&gt; findAll(){<br />
&nbsp; return userDao.findAllUsers();<br />
&nbsp;}&nbsp;&nbsp;&nbsp; <br />
&nbsp;public void update(User user){<br />
&nbsp;&nbsp;this.userDao.updateUser(user);<br />
&nbsp;}<br />
}</p>
<p>15:回到SaveUserAction中 <br />
&nbsp;private UserService service;//生成setters方法，<br />
&nbsp;public String execute() throws Exception{<br />
&nbsp; this.service.save(user);<br />
&nbsp; return SUCCESS;<br />
&nbsp;}<br />
16:现在代码已经编写玩了，但是还不能运行<br />
&nbsp;&nbsp; 因为我们还没有写配置文件，里面要写依赖关系与注入关系</p>
<p>17:struts.xml<br />
&nbsp;&nbsp; &lt;struts&gt;<br />
&nbsp;&lt;package name="user" extends="struts-default"&gt;<br />
&nbsp;&nbsp;&lt;action name="saveUser" class="saveUserAction"&gt; //saveUserAction 为spring中配置文件里面的id<br />
&nbsp;&nbsp;&nbsp;&lt;result name="success" type="redirect"&gt;listUser&lt;/result&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;result name="input"&gt;/save.jsp&lt;/result&gt;<br />
&nbsp;&nbsp;&lt;/action&gt;<br />
&nbsp;&lt;/package&gt;<br />
&nbsp;&nbsp; &lt;/struts&gt;</p>
<p><br />
18:applicationContext.xml<br />
&lt;bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"&gt;<br />
&nbsp;&lt;property name="driverClassName" value="com.mysql.jdbc.Driver"&gt;&lt;/property&gt;<br />
&nbsp;&lt;property name="url" value="jdbc:mysql://localhost:3306/mytest"&gt;&lt;/property&gt;<br />
&nbsp;&lt;property name="username" value="root"&gt;&lt;/property&gt;<br />
&nbsp;&lt;property name="password" value="root"&gt;&lt;/property&gt;<br />
&nbsp;&lt;property name="maxActive" value="100"&gt;&lt;/property&gt;连接池中最大100个连接<br />
&nbsp;&lt;property name="maxIdle" value="30"&gt;&lt;/property&gt;连接池最大有30个空闲的连接<br />
&nbsp;&lt;property name="maxWait" value="500"&gt;&lt;/property&gt;<br />
&nbsp;&lt;property name="defaultAutoCommit" value="true"&gt;&lt;/property&gt;每执行完一次数据操作就执行事务<br />
&lt;/bean&gt;</p>
<p>&lt;bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&gt;<br />
&nbsp;&lt;property name="dataSource" ref="dataSource"&gt;&lt;/property&gt;<br />
&nbsp;&lt;property name="hibernateProperties"&gt;<br />
&nbsp;&nbsp;&lt;props&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;prop key="hibernate.dialect"&gt;org.hibernate.dialect.MySQLDialect&lt;/prop&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;prop key="hibernate.show_sql"&gt;true&lt;/prop&gt;<br />
&nbsp;&nbsp;&lt;/props&gt;<br />
&nbsp;&lt;/property&gt;<br />
&nbsp;&lt;property name="mappingResources"&gt;<br />
&nbsp;&nbsp;&lt;list&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;value&gt;com/test/bean/User.hbm.xml&lt;/value&gt;<br />
&nbsp;&nbsp;&lt;/list&gt;<br />
&nbsp;&lt;/property&gt;<br />
&lt;/bean&gt;</p>
<p>对于没有状态的bean bean设置为singleton(单例)<br />
spring中的singleton 对于ioc容器只生成一个实例<br />
&lt;bean id="userDao" class="com.test.dao.impl.UserDAOImpl" scope="singleton"&gt;<br />
&nbsp;&lt;property name="sessionFactory"&gt;<br />
&nbsp;&nbsp;&lt;ref bean="sessionFactory"/&gt;<br />
&nbsp;&lt;/property&gt;<br />
&lt;/bean&gt;</p>
<p>&lt;bean id="userService" class="com.test.service.impl.UserServiceImpl"&gt;<br />
&nbsp;&lt;property name="userDao" ref="userDao"&gt;&lt;/property&gt;<br />
&lt;/bean&gt;<br />
对于有状态的bean bean设置为prototype<br />
&lt;bean id="saveUserAction" class="com.test.action.user.SaveUserAction" scope="prototype"&gt;<br />
&nbsp;&lt;property name="service" ref="userService"&gt;&lt;/property&gt;<br />
&lt;/bean&gt;</p>
<p>&lt;bean id="listUserAction" class="com.test.action.user.ListUserAction" scope="prototype"&gt;<br />
&nbsp;&lt;property name="service" ref="userService"&gt;&lt;/property&gt;<br />
&lt;/bean&gt;</p>
<p>&lt;bean id="removeUserAction" class="com.test.action.user.RemoveUserAction" scope="prototype"&gt;<br />
&nbsp;&lt;property name="service" ref="userService"&gt;&lt;/property&gt;<br />
&lt;/bean&gt;<br />
19:运行项目 会报错<br />
&nbsp; 说没有这样的方法的异常。这是原因是jar的冲突<br />
&nbsp; 把asm-2.2.3.jar 这个jar包删除<br />
&nbsp;&nbsp; 再运行项目，应该就不会报错了<br />
20:完成ListUserAction 显示所有用户<br />
&nbsp;public class ListUser Action extends ActionSupport implements RequestAware{<br />
&nbsp;private Map&lt;String,Object&gt; request;//有setters方法<br />
&nbsp;private UserService service;//生成setters方法，<br />
&nbsp;public String execute() throws Exception{<br />
&nbsp; //this.service.findAll();<br />
&nbsp;&nbsp; request.put("list",this.service.findAll());<br />
&nbsp;return SUCCESS;<br />
&nbsp;}<br />
}</p>
<p>21:写list.jsp 显示所有的用户信息<br />
&lt;s:iterator value="#request.list" id="us"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&lt;tr&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&lt;td&gt;&lt;s:property value="#us.id"/&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&lt;/td&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&lt;td&gt;&lt;s:property value="#us.firstname"/&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&lt;/td&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&lt;td&gt;&lt;s:property value="#us.lastname"/&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&lt;/td&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&lt;td&gt;&lt;s:property value="#us.age"/&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&lt;/td&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&lt;td&gt;&lt;s:a href="deleteUser.action?user.id=%{#us.id}" onclick="return del();"&gt;delete&lt;/s:a&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&lt;/td&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&lt;td&gt;&lt;s:a href="updatePUser.action?user.id=%{#us.id}"&gt;update&lt;/s:a&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&lt;/td&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;<br />
&nbsp;&nbsp; &nbsp;&nbsp;<br />
&nbsp;&nbsp; &nbsp;&nbsp;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&lt;/tr&gt;<br />
&lt;/s:iterator&gt;</p>
<p>作业：</p>
<p>1. 完成save user页面的输入校验（姓不能为空，名不能为空，年龄不能为空且在1—150之间），采用代码的方式完成（override validate方法），采用校验框架的方式完成（有两种办法）</p>
<p>2. 当校验框架验证失败时，看看有什么情况发生。</p>
<p><br />
22:在save.jsp中 进行数据校验SaveUserAction-validation.xml<br />
&nbsp; &lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"&gt;</p>
<p>&lt;validators&gt;<br />
&nbsp;&lt;field name="user.firstname"&gt;<br />
&nbsp;&nbsp;&lt;field-validator type="requiredstring"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;message&gt;required first name&lt;/message&gt;<br />
&nbsp;&nbsp;&lt;/field-validator&gt;<br />
&nbsp;&lt;/field&gt;<br />
&nbsp;<br />
&nbsp;&lt;field name="user.lastname"&gt;<br />
&nbsp;&nbsp;&lt;field-validator type="requiredstring"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;message&gt;required last name&lt;/message&gt;<br />
&nbsp;&nbsp;&lt;/field-validator&gt;<br />
&nbsp;&lt;/field&gt;<br />
&nbsp;<br />
&nbsp;&lt;field name="user.age"&gt;<br />
&nbsp;&nbsp;&lt;field-validator type="required"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;message&gt;required age&lt;/message&gt;<br />
&nbsp;&nbsp;&lt;/field-validator&gt;<br />
&nbsp;&nbsp;&lt;field-validator type="int"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;param name="min"&gt;1&lt;/param&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;param name="max"&gt;150&lt;/param&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;message&gt;age should be between ${min} and ${max}&lt;/message&gt;<br />
&nbsp;&nbsp;&lt;/field-validator&gt;<br />
&nbsp;&lt;/field&gt;<br />
&nbsp;<br />
&lt;/validators&gt;</p>
<p>还可以写第2种校验方式<br />
SaveUserAction-validation.xml<br />
&nbsp; &lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"&gt;</p>
<p>&lt;validators&gt;<br />
&nbsp;&lt;field name="user"&gt;<br />
&nbsp;&nbsp;&lt;field-validator type="visitor"&gt; visitor 需要通过另外的文件进行校验<br />
&nbsp;&nbsp;&nbsp;&lt;param name="context"&gt;user&lt;/param&gt;另外的文件的名字为user<br />
&nbsp;&nbsp;&nbsp;&lt;param name="appendPrefix"&gt;true&lt;/param&gt; 错误的前缀信息大部分都相同<br />
&nbsp;&nbsp;&nbsp;&lt;message&gt;user's &lt;/message&gt; 错误的前缀<br />
&nbsp;&nbsp;&lt;/field-validator&gt;<br />
&nbsp;&lt;/field&gt;<br />
&lt;/validators&gt;</p>
<p>另外的校验文件放在哪里呢？（我们这里要校验User类，所以这个文件必须放在User.java相同的包名）<br />
取名为类名-context的名字-validation.xml 例如 User-user-validation.xml<br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"&gt;</p>
<p>&lt;validators&gt;<br />
&nbsp;&lt;field name="firstname"&gt;<br />
&nbsp;&nbsp;&lt;field-validator type="requiredstring"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;message&gt;required first name&lt;/message&gt;<br />
&nbsp;&nbsp;&lt;/field-validator&gt;<br />
&nbsp;&lt;/field&gt;</p>
<p>&nbsp;&lt;field name="lastname"&gt;<br />
&nbsp;&nbsp;&lt;field-validator type="requiredstring"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;message&gt;required last name&lt;/message&gt;<br />
&nbsp;&nbsp;&lt;/field-validator&gt;<br />
&nbsp;&lt;/field&gt;</p>
<p>&nbsp;&lt;field name="age"&gt;<br />
&nbsp;&nbsp;&lt;field-validator type="required"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;message&gt;required age&lt;/message&gt;<br />
&nbsp;&nbsp;&lt;/field-validator&gt;<br />
&nbsp;&nbsp;&lt;field-validator type="int"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;param name="min"&gt;1&lt;/param&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;param name="max"&gt;150&lt;/param&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;message&gt;age should be between ${min} and ${max}&lt;/message&gt;<br />
&nbsp;&nbsp;&lt;/field-validator&gt;<br />
&nbsp;&lt;/field&gt;</p>
<p>&lt;/validators&gt;</p>
<p><br />
这2种校验方式，建议采取第1种。</p>
<p><br />
当校验框架验证失败时(如果什么都不填，肯定会出现错误信息)，这时候，我反复提交，此时<br />
错误信息会随着提交次数的增加，错误信息也会增加。<br />
怎么解决这个问题呢？<br />
原因:<br />
当我们客户端每次请求action的时候，Action类都会产生一个实例，每个实例都是有状态的。<br />
都会保存自己的状态信息（错误信息）。但是现在的情况下，每次请求的时候，Action类只<br />
产生一个实例，所有请求都只对应一个实例，所以所有的错误信息都附加在这个实例上。<br />
所以会输出很多错误信息的。<br />
因为是在spring中的设置形成的(这样设置会每次请求都只会对应一个实例)<br />
&lt;bean id="saveUserAction" class="com.test.action.user.SaveUserAction"&gt;<br />
&nbsp;&lt;property name="service" ref="userService"&gt;&lt;/property&gt;<br />
&lt;/bean&gt;<br />
这样设置就表示这个action 所有请求都只有一个实例</p>
<p>所以要改成这样（保证每次请求都会产生一个实例）<br />
&lt;bean id="saveUserAction" class="com.test.action.user.SaveUserAction" scope="prototype"&gt;<br />
&nbsp;&lt;property name="service" ref="userService"&gt;&lt;/property&gt;<br />
&lt;/bean&gt;</p>
<p><br />
23:删除一个用户</p>
<p>24:更新用户</p>
<p>25：将用户列表已excel的格式显示出来<br />
需要用到poi组件<br />
要完成将用户列表显示在excel中，需要完成3步<br />
a：将数据读出来<br />
b：把数据写道excel中<br />
c：把这个excel文件在浏览器中可以下载</p>
<p>在UserService接口中增加一个方法<br />
public InputStream getInputStream();<br />
在UserServiceImpl中实现上面的方法</p>
<p>public InputStream getInputStream(){<br />
&nbsp;HSSFWorkbook wb = new HSSFWorkbook();<br />
&nbsp;&nbsp;//创建一个工作簿<br />
&nbsp;&nbsp;HSSFSheet sheet = wb.createSheet("sheet1");</p>
<p>&nbsp;&nbsp;HSSFRow row = sheet.createRow(0);</p>
<p>&nbsp;&nbsp;HSSFCell cell = row.createCell((short) 0);<br />
&nbsp;&nbsp;cell.setEncoding(HSSFCell.ENCODING_UTF_16);<br />
&nbsp;&nbsp;cell.setCellValue("序号");</p>
<p>&nbsp;&nbsp;cell = row.createCell((short) 1);<br />
&nbsp;&nbsp;cell.setEncoding(HSSFCell.ENCODING_UTF_16);<br />
&nbsp;&nbsp;cell.setCellValue("姓");</p>
<p>&nbsp;&nbsp;cell = row.createCell((short) 2);<br />
&nbsp;&nbsp;cell.setEncoding(HSSFCell.ENCODING_UTF_16);<br />
&nbsp;&nbsp;cell.setCellValue("名");</p>
<p>&nbsp;&nbsp;cell = row.createCell((short) 3);<br />
&nbsp;&nbsp;cell.setEncoding(HSSFCell.ENCODING_UTF_16);<br />
&nbsp;&nbsp;cell.setCellValue("年龄");</p>
<p>&nbsp;&nbsp;List&lt;User&gt; list = this.findAll();</p>
<p>&nbsp;&nbsp;for (int i = 0; i &lt; list.size(); ++i)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;User user = list.get(i);</p>
<p>&nbsp;&nbsp;&nbsp;row = sheet.createRow(i + 1);</p>
<p>&nbsp;&nbsp;&nbsp;cell = row.createCell((short) 0);<br />
&nbsp;&nbsp;&nbsp;cell.setEncoding(HSSFCell.ENCODING_UTF_16);<br />
&nbsp;&nbsp;&nbsp;cell.setCellValue(i + 1);</p>
<p>&nbsp;&nbsp;&nbsp;cell = row.createCell((short) 1);<br />
&nbsp;&nbsp;&nbsp;cell.setEncoding(HSSFCell.ENCODING_UTF_16);<br />
&nbsp;&nbsp;&nbsp;cell.setCellValue(user.getFirstname());</p>
<p>&nbsp;&nbsp;&nbsp;cell = row.createCell((short) 2);<br />
&nbsp;&nbsp;&nbsp;cell.setEncoding(HSSFCell.ENCODING_UTF_16);<br />
&nbsp;&nbsp;&nbsp;cell.setCellValue(user.getLastname());</p>
<p>&nbsp;&nbsp;&nbsp;cell = row.createCell((short) 3);<br />
&nbsp;&nbsp;&nbsp;cell.setEncoding(HSSFCell.ENCODING_UTF_16);<br />
&nbsp;&nbsp;&nbsp;cell.setCellValue(user.getAge());<br />
&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;File file = new File("test.xls");</p>
<p>&nbsp;&nbsp;try<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;OutputStream os = new FileOutputStream(file);<br />
&nbsp;&nbsp;&nbsp;wb.write(os);//使用输出流把数据写道test.xls中<br />
&nbsp;&nbsp;&nbsp;os.close();<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;catch (Exception e)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;InputStream is = null;<br />
&nbsp;&nbsp;try<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;is = new FileInputStream(file);<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;catch (FileNotFoundException e)<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;return is;<br />
}</p>
<p>package com.test.action.user;<br />
//产生下载excel的action<br />
public class GenerateExcelAction extends ActionSupport<br />
{<br />
&nbsp;private UserService service;</p>
<p>&nbsp;public UserService getService()<br />
&nbsp;{<br />
&nbsp;&nbsp;return service;<br />
&nbsp;}</p>
<p>&nbsp;public void setService(UserService service)<br />
&nbsp;{<br />
&nbsp;&nbsp;this.service = service;<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;public InputStream getDownloadFile()//这个方法名必须与struts.xml中的inputName相同<br />
&nbsp;{<br />
&nbsp;&nbsp;return this.service.getInputStream();<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;@Override<br />
&nbsp;public String execute() throws Exception<br />
&nbsp;{<br />
&nbsp;&nbsp;return SUCCESS;<br />
&nbsp;}<br />
}</p>
<p>struts.xml中配置<br />
AllUsers.xls的名字为准，前面的xls名字随便取<br />
&lt;action name="generateExcel" class="generateExcelAction"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;result name="success" type="stream"&gt; stream表示二进制<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;param name="contentType"&gt;application/vnd.ms-excel&lt;/param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;param name="contentDisposition"&gt;filename="AllUsers.xls"&lt;/param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;param name="inputName"&gt;downloadFile&lt;/param&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;/result&gt;<br />
&lt;/action&gt;<br />
在list.jsp中<br />
&lt;s:a href="generateExcel.action"&gt;下载excel&lt;/s:a&gt;<br />
</p>
<img src ="http://www.blogjava.net/gjynewer/aggbug/324913.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gjynewer/" target="_blank">gjy</a> 2010-06-30 17:22 <a href="http://www.blogjava.net/gjynewer/articles/324913.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>