亚洲专区一区,成人性生交大片免费看午夜,欧美激情精品久久久六区热门http://www.aygfsteel.com/gjynewer/category/45465.htmlzh-cnMon, 05 Jul 2010 05:16:24 GMTMon, 05 Jul 2010 05:16:24 GMT60spring-security安全管理http://www.aygfsteel.com/gjynewer/articles/325124.htmlgjygjySat, 03 Jul 2010 02:55:00 GMThttp://www.aygfsteel.com/gjynewer/articles/325124.htmlhttp://www.aygfsteel.com/gjynewer/comments/325124.htmlhttp://www.aygfsteel.com/gjynewer/articles/325124.html#Feedback0http://www.aygfsteel.com/gjynewer/comments/commentRss/325124.htmlhttp://www.aygfsteel.com/gjynewer/services/trackbacks/325124.html安全管理 -Spring-Security
簡(jiǎn)單例子:
1:加入spring-Securtiy 的jar包
2:在web.xml中配置
<filter>
 <filter-name>springSecurityFilterChain</filter-name>
 <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
 <filter-name>springSecurityFilterChain</filter-name>
 <url-pattern>/*</url-pattern>
</filter-mapping>
3:修改applicationContext-security.xml如下
<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:ss="http://www.springframework.org/schema/security"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
                        http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.1.xsd">

 <!--最簡(jiǎn)單配置-->
 <ss:http auto-config="true">
  url攔截信息   /** 所有的
  <ss:intercept-url pattern="/**" access="ROLE_ADMIN"/>
 </ss:http>
 <ss:authentication-provider>
   <ss:user-service> 用戶的認(rèn)證  authorities 權(quán)限
  <ss:user password="admin" name="admin" authorities="ROLE_ADMIN"/>
  <!--在第5步完成后添加一個(gè)用戶試驗(yàn) -->
  輸入用戶名user,密碼user 會(huì)出現(xiàn)403 訪問拒絕的錯(cuò)誤,原因是
  權(quán)限ROLE_USER 在ss:intercept-url 沒有攔截任何url
  如果修改上面如下:<ss:intercept-url pattern="/**" access="ROLE_ADMIN,ROLE_USER"/>
  就沒有問題
  <ss:user password="user" name="user" authorities="ROLE_USER"/>
   </ss:user-service>
 </ss:authentication-provider>
</beans>

4:啟動(dòng)項(xiàng)目
5:http://localhost:8080/fpm/回車
  會(huì)自動(dòng)出現(xiàn)一個(gè)spring-security的一個(gè)登錄界面(自動(dòng)生產(chǎn)的登錄界面)
  輸入admin 和admin 就可以進(jìn)入,否則會(huì)提示錯(cuò)誤信息
6:登錄界面是系統(tǒng)給的。接下來是一個(gè)自定義的登錄界面
<%@ page contentType="text/html;charset=UTF-8"%>
<%@ include file="/common/taglibs.jsp"%>


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
 <title>FPM -- 管理系統(tǒng)</title>
 <%@ include file="/common/metas.jsp"%>
</head>
<body>
 action,name 用spring-security的固定格式
  <form name="loginForm" action="${path}/j_spring_security_check" method="POST">
 <table>
 <tr>
  <td>用戶名:</td>
  <td><input type="text" name="j_username"/></td>
 </tr>
 <tr>
  <td>密碼:</td>
  <td><input type="password" name="j_password"/></td>
 </tr>
 <tr>
  <td colspan="2">
  <input type="submit" value="登錄"/></td>
 </tr>
 </table>
  </form>
</body>

7:修改applicationContext-security.xml如下
  在<ss:http auto-config="true">中增加如下代碼
  <ss:form-login
 login-page="登錄頁面"
 authentication-failure-url="登錄失敗頁面"
 default-target-url="登錄成功的頁面"
 />
8:?jiǎn)?dòng)項(xiàng)目,輸入http://localhost:8080/fpm/  發(fā)現(xiàn)進(jìn)去不了
   原因是:web.xml中的過濾器攔截了這個(gè),然后跳轉(zhuǎn)到form-login中的login-page中
  但是login-page 又被攔截,所以限入了死循環(huán)了
  在這句前面加上<ss:intercept-url pattern="/**" access="ROLE_ADMIN"/>
  <ss:intercept-url pattern="登錄頁面" filters="none"/> 表示登錄頁面不被過濾

9:怎么用數(shù)據(jù)庫去存儲(chǔ)用戶,密碼(這都是spring-security的默認(rèn)方式)
 create table users( --用戶表
    username varchar2(50) not null,
    password varchar2(50) not null,
    enabled char(1) not null --當(dāng)前用戶是否可用 boolean 也可以
);

create table authorities ( --權(quán)限表
    username varchar2(50) not null, --用戶
    authority varchar2(50) not null --權(quán)限
);

insert into users(username,password,enabled) values('admin','admin','1');
insert into users(username,password,enabled) values('user','user','1');

insert into authorities(username,authority) values('admin','ROLE_ADMIN');
insert into authorities(username,authority) values('admin','ROLE_USER');
insert into authorities(username,authority) values('user','ROLE_USER');

10:修改applicationContext-security.xml如下
  先禁止<ss:authentication-provider> 然后添加如下
 <ss:authentication-provider>
 <ss:jdbc-user-service data-source-ref="spring中數(shù)據(jù)源名字"/>
 </ss:authentication-provider>

11:運(yùn)行項(xiàng)目 訪問數(shù)據(jù)庫中的用戶 也可以。
12:修改applicationContext-security.xml如下
<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:ss="http://www.springframework.org/schema/security"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
                        http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.1.xsd">

 <ss:http auto-config="true">
  <ss:intercept-url pattern="/common/**" filters="none"/>
  <ss:intercept-url pattern="/css/**" filters="none"/>
  <ss:intercept-url pattern="/images/**" filters="none"/>
  <ss:intercept-url pattern="/js/**" filters="none"/>
  IS_AUTHENTICATED_ANONYMOUSLY 表示匿名權(quán)限,所有匿名都來login.action中
  <ss:intercept-url pattern="/login.action" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
  <ss:intercept-url pattern="/company/company.action" access="ROLE_ADMIN"/>
  <ss:intercept-url pattern="/dept/dept.action" access="ROLE_USER"/>
  IS_AUTHENTICATED_FULLY 默認(rèn)權(quán)限,只要登錄就可以訪問(不管是admin還是其他權(quán)限)
  <ss:intercept-url pattern="/**" access="IS_AUTHENTICATED_FULLY"/>
  
  <ss:form-login
   login-page="/login.action"
   authentication-failure-url="/login.action?error=true"
   default-target-url="/"
  />
  
 </ss:http>
 
 <!--<ss:authentication-provider>
  <ss:user-service>
   <ss:user password="admin" name="admin" authorities="ROLE_ADMIN,ROLE_USER"/>
   <ss:user password="user" name="user" authorities="ROLE_USER"/>
  </ss:user-service>
 </ss:authentication-provider>

-->

 <ss:authentication-provider>
  <ss:jdbc-user-service data-source-ref="dataSource"/>
 </ss:authentication-provider>

</beans>

13:前面的都是默認(rèn)的數(shù)據(jù)庫
自定義數(shù)據(jù)庫用戶權(quán)限管理

 create table test_users( --用戶表
    id varchar2(100) not null primary key,
    username varchar2(200) not null,
    password varchar2(200) not null,
    enabled char(1) not null --當(dāng)前用戶是否可用 boolean 也可以
);
數(shù)據(jù)為
1  admin admin 1
2  user user   1
create table test_role(
 id varchar2(100) not null primary key,
 role_name  varchar2(100) not null
)
數(shù)據(jù)為
1  ROLE_ADMIN
2  ROLE_USER
create table test_user_role(
  user_id varchar2(100),
  role_id varchar2(100)
)
數(shù)據(jù)為
1 1
1       2
2       2

修改applicaitonContext-security.xml
<ss:authentication-provider>
  <ss:password-encoder hash="md5"/>
  
  <ss:jdbc-user-service data-source-ref="dataSource"
  users-by-username-query="select username,password,enabled from test_user where username = ?"
  authorities-by-username-query="select u.username,r.role_name authority from test_user u
           join test_user_role ur on ur.user_id = u.id
           join test_role r on ur.role_id = r.id
           where u.username = ?"/>
 </ss:authentication-provider>

users-by-username-query:由用戶名查詢出用戶
authorities-by-username-query:由用戶名查詢出權(quán)限


14:對(duì)數(shù)據(jù)加密(md5)



gjy 2010-07-03 10:55 發(fā)表評(píng)論
]]>
struts2整合JFreeCharthttp://www.aygfsteel.com/gjynewer/articles/324991.htmlgjygjyThu, 01 Jul 2010 07:52:00 GMThttp://www.aygfsteel.com/gjynewer/articles/324991.htmlhttp://www.aygfsteel.com/gjynewer/comments/324991.htmlhttp://www.aygfsteel.com/gjynewer/articles/324991.html#Feedback0http://www.aygfsteel.com/gjynewer/comments/commentRss/324991.htmlhttp://www.aygfsteel.com/gjynewer/services/trackbacks/324991.htmlJFreeChart 是一個(gè)非常流行的一個(gè)免費(fèi)開源的圖表軟件
已經(jīng)有8年以上的歷史

首先要下載jar包
www.jfree.org

在http://www.jfree.org/jfreechart 下點(diǎn)擊Project Page at SourceForge 去下載
要下載JFreeChart 與JCommon

把jfreechart-1.0.9.jar與jcommon-1.0.12.jar加入到系統(tǒng)中

做JFreeChart的時(shí)候,一般是以下三步
1:要有數(shù)據(jù) 比如DefaultPieDataset
2:根據(jù)數(shù)據(jù)生成 JFreeChart 對(duì)象
3:顯示JFreeChart對(duì)象(顯示在swing中或生成一個(gè)圖片在jsp中顯示)


一:體驗(yàn)下JFreeChart的強(qiáng)大功能(讀javadoc文檔 一個(gè)最重要的類JFreeChart)
 package com.test.jfreechart
 public class JFreeChartTest{
 public static void main(String []args){
  //首先要有數(shù)據(jù)(Dataset數(shù)據(jù)集)
  DefaultPieDataset dpd=new DefaultPieDataset();
  //setValue(Comparable key ,double value);
  //字符串實(shí)現(xiàn)了Comparable接口
  dpd.setValue("管理人員",25);
  dpd.setValue("市場(chǎng)人員",25);
  dpd.setValue("開發(fā)人員",45);
  dpd.setValue("其他人員",10);
  //然后把數(shù)據(jù)放入到JFreeChart 中
  //創(chuàng)建一個(gè)平面圖形
  JFreeChart chart=CharFactory.createPieChart("某公司人員組織結(jié)構(gòu)圖",dbp,true,false,false);
     //JFreeChart chart=CharFactory.createPieChart3D("某公司人員組織結(jié)構(gòu)圖",dbp,true,false,false);
  //通過swing顯示出來
  ChartFrame frame=new ChartFrame("標(biāo)題",chart);
  frame.pack();
  frame.setVisible(true);
 }
 }

  上面會(huì)顯示一個(gè)餅狀圖,一般來說,圖形有3部分組成
   1:標(biāo)題
   2:中間的圖形(叫plot)
   3:底部有個(gè)說明什么顏色表示什么數(shù)據(jù)(legend)
package com.test.jfreechart
//ApplicationFrame 是屬于Jcommon中的
 public class JFreeChartTest2 extends ApplicationFrame{ 柱狀圖
 public JFreeChartTest2(String title)
 {
  super(title);

  this.setContentPane(createPanel());
 }

 public static CategoryDataset createDataset()
 {
  //默認(rèn)柱狀圖數(shù)據(jù)集  Category(柱狀)
  DefaultCategoryDataset dataset = new DefaultCategoryDataset();
  //setValue(double value,Comparable rowKey,Comparable columnKey)
  dataset.setValue(10, "aa", "管理人員");
  dataset.setValue(20, "bb", "市場(chǎng)人員");
  dataset.setValue(40, "cc", "開發(fā)人員");
  dataset.setValue(15, "dd", "其他人員");

  return dataset;
 }

 //把數(shù)據(jù)加到chart 圖表中
 public static JFreeChart createChart(CategoryDataset dataset)
 {
  JFreeChart chart = ChartFactory.createBarChart3D("hello", "人員分布", "人員數(shù)量",
    dataset, PlotOrientation.VERTICAL, true, false, false);

  chart.setTitle(new TextTitle("某公司組織結(jié)構(gòu)圖", new Font("宋體", Font.BOLD
    + Font.ITALIC, 20)));

  CategoryPlot plot = (CategoryPlot) chart.getPlot();

  CategoryAxis categoryAxis = plot.getDomainAxis();

  categoryAxis.setLabelFont(new Font("微軟雅黑", Font.BOLD, 12));

  return chart;

 }
 public static JPanel createPanel()
 {
  JFreeChart chart = createChart(createDataset());

  return new ChartPanel(chart);
 }

 public static void main(String[] args)
 {
  JFreeChartTest2 chart = new JFreeChartTest2("某公司組織結(jié)構(gòu)圖");

  chart.pack();
  chart.setVisible(true);
 }
 
 }

二:上面都是在swing中生成的圖形,我們?cè)趙eb程序里面怎么做呢
  下面把JFreeChart 生成一個(gè)圖片,那么在web程序中就可以調(diào)用這個(gè)圖片了
  public class JFreeChartTest3
{
 public static void main(String[] args) throws Exception
 {
  JFreeChart chart = ChartFactory.createPieChart("某公司組織結(jié)構(gòu)圖",
    getDataset(), true, false, false);

  chart.setTitle(new TextTitle("某公司組織結(jié)構(gòu)圖", new Font("宋體", Font.BOLD,22)));

  LegendTitle legend = chart.getLegend(0);

  legend.setItemFont(new Font("微軟雅黑", Font.BOLD, 14));

  PiePlot plot = (PiePlot) chart.getPlot();

  plot.setLabelFont(new Font("隸書", Font.BOLD, 16));

  //通過輸出流把圖形 創(chuàng)建為一個(gè)圖片
  OutputStream os = new FileOutputStream("company.jpeg");
  //將chart 輸出到os中,寬為1000,高為800
  ChartUtilities.writeChartAsJPEG(os, chart, 1000, 800);

  os.close();

 }

 private static DefaultPieDataset getDataset()
 {
  DefaultPieDataset dpd = new DefaultPieDataset();

  dpd.setValue("管理人員", 25);
  dpd.setValue("市場(chǎng)人員", 25);
  dpd.setValue("開發(fā)人員", 45);
  dpd.setValue("其他人員", 10);

  return dpd;
 }

}

三:如何在jsp中顯示JFreeChart生成的圖片

org.jfree.chart.servlet.DisplayChart
這是一個(gè)servlet,這個(gè)Servlet會(huì)作為一個(gè)流把圖片輸出到客戶端
要使用DisplayChart 那么在web.xml中必須配置如下代碼
 <servlet>
  <servlet-name>DisplayChart</servlet-name>
  <servlet-class>
   org.jfree.chart.servlet.DisplayChart
  </servlet-class>
 </servlet>
 <servlet-mapping>
  <servlet-name>DisplayChart</servlet-name>
  <url-pattern>/DisplayChart</url-pattern>
 </servlet-mapping>

  <%@ page language="java" contentType="text/html; charset=GB18030"
    pageEncoding="GB18030"%>
   
<%@ page import="org.jfree.data.general.DefaultPieDataset,org.jfree.chart.ChartFactory
,org.jfree.chart.JFreeChart,org.jfree.chart.servlet.*" %>
   
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
<title>Insert title here</title>
</head>
<body>

<%

DefaultPieDataset dpd = new DefaultPieDataset();

dpd.setValue("管理人員", 25);
dpd.setValue("市場(chǎng)人員", 25);
dpd.setValue("開發(fā)人員", 45);
dpd.setValue("其他人員", 10);

JFreeChart chart = ChartFactory.createPieChart3D("某公司組織結(jié)構(gòu)圖",dpd, true, false, false);
//ServletUtilities 能幫助生成圖片對(duì)象
String fileName = ServletUtilities.saveChartAsPNG(chart,800,600,session);

String url = request.getContextPath() + "/DisplayChart?filename=" + fileName;

%>

<img src="<%= url %>" width="800" height="600">


</body>
</html>

四:要通過Struts2整合JFreeChart ,可以學(xué)到Struts2整合其他插件的通用方法
怎么通過Struts2整合JFreeChart
通過用戶投票這個(gè)例子達(dá)到整合
select.jsp
<h1>請(qǐng)選擇喜歡的運(yùn)動(dòng)項(xiàng)目</h1>
<s:form action="viewResult">
 <s:checkbox name="interest" label="足球"></s:checkbox>
 <s:checkbox name="interest" label="籃球"></s:checkbox>
 <s:checkbox name="interest" label="排球"></s:checkbox>
 <s:checkbox name="interest" label="羽毛球"></s:checkbox>
</s:form>
上面的方式,顯示的時(shí)候所有的value都為true 這顯然不行的。
不可能提交的表單都為true的,修改如下
<h1>請(qǐng)選擇喜歡的運(yùn)動(dòng)項(xiàng)目</h1>
<s:form action="viewResult">
 <s:checkbox name="interest" label="足球" fieldValue="football"></s:checkbox>
 <s:checkbox name="interest" label="籃球" fieldValue="basktball"></s:checkbox>
 <s:checkbox name="interest" label="排球" fieldValue="volleytball"></s:checkbox>
 <s:checkbox name="interest" label="羽毛球" fieldValue="badminton"></s:checkbox>

  <!--<s:checkboxlist list="#{'computer':'計(jì)算機(jī)','math':'數(shù)學(xué)'}"> name="interest" label="陽光" labelPosition="top"></s:checkboxlist>
-->
 <s:submit value="提交"/>
</s:form>

<s:checkbox>與<s:checkboxlist>這2個(gè)標(biāo)簽都是復(fù)選框,推薦使用s:checkbox

//要把struts2-jfreechart-plugin.jar復(fù)制到系統(tǒng)中

ViewResult這個(gè)Action的作用就是
首先把復(fù)選框中的數(shù)據(jù)加入到interest這個(gè)List中
然后把這個(gè)數(shù)據(jù)放到chart這個(gè)對(duì)象中
然后把chart對(duì)象交給JFreechart-plugin插件顯示輸出


這個(gè)action執(zhí)行的時(shí)候,會(huì)執(zhí)行execute方法
返回SUCCESS
這是的結(jié)果類型為chart,那么jfreechart-plugin這個(gè)插件會(huì)自動(dòng)
調(diào)用action中的getChart方法,并顯示出來

package com.test.action;
public class ViewResultAction extends ActionSupport{
  private JFreeChart chart;//chart變量不能隨便改的
  //chart的setters getters方法
  public JFreeChart getChart(){
 chart=ChartFactory.createBarChart("興趣統(tǒng)計(jì)結(jié)果","項(xiàng)目","結(jié)果",getDataset(),PlotOrientation.VERTICAL,false,false,false);
 chart.setTitle(new TextTitle("興趣統(tǒng)計(jì)結(jié)果",new Font("黑體",Font.BOLD,22)));
 CategoryPlot plot=(CategoryPlot)chart.getPlot();
 CategoryAxis axis=plot.getDomainAxis();//x坐標(biāo)
 axis.setLabelFont(new Font("宋體",Font.BOLD,22));
 axis.setCategoryLabelPositionOffset(CategoryLabelPositions.UP_45);//字體的傾斜度
 
 return chart;
  }
  //獲得表單數(shù)據(jù)
  private List<String> interest;//自動(dòng)把復(fù)選框的值設(shè)置到List中
  //getters,setters方法
  public String execute() throws Exception{
 //從struts.apache.org中找到
 //jfreechart-plugin
        //jfreechart-plugin這個(gè)插件 能夠把chart對(duì)象(自動(dòng)調(diào)用getChart()方法)生成到客戶端并能夠顯示
 //不會(huì)我們?nèi)懘a生成圖片顯示了 
 return SUCCESS;
  }

  //把list客戶端的復(fù)選框的值保存到application中
  private void increaseResult(List<String> list){
 ActionContext context=ActionContext.getContext();
 Map map=context.getApplication();//獲得application對(duì)象
 //application對(duì)象中保存投票的結(jié)果 模擬
 for(String str:list){
  if(null==map.get(str)){//第一次投票
  map.put(str,1);
   }
   else{//表示這個(gè)選項(xiàng)不是第一次投票
      map.put(str,(Integer)map.get(str)+1);
   }
 }
  }
  private CategoryDataset getDataset(){//產(chǎn)生柱狀圖的數(shù)據(jù)
 DefaultCategoryDataset dataset=new DefaultCategoryDataset();
 increaseResult(this.getInterest());//把數(shù)據(jù)更新到application中
 ActionContext context=ActionContext.getContext();
 Map map=context.getApplication();
 //把a(bǔ)pplication中的數(shù)據(jù)放到dataset中
 dataset.setValue((Integer)map.get("football"),"","足球");
 dataset.setValue((Integer)map.get("basketball"),"","藍(lán)球");
 dataset.setValue((Integer)map.get("volleyball"),"","排球");
 dataset.setValue((Integer)map.get("badminton"),"","羽毛球");
 return dataset;
  }
}
把jfreechart-plugin的jar包解壓縮
修改struts-plugin.xml中
把<package name="jfreechart-default">
修改為
<package name="jfreechart-default" extends="struts-default">
然后把jfreechart-plugin的jar包重新打包
jar cvf struts2-jfreechart-plugin-版本號(hào).jar  -C
生成后重新放到系統(tǒng)中

在struts.xml中進(jìn)行配置
修改如下
<package name="struts2" extends="jfreechart-default">
<action name="viewResult" class="com.test.action.ViewResultAction">
   <result name="success" type="chart">
   <param name="height">600</param>
       <param name="width">800</param>
   </result>
</action>


這樣 運(yùn)行項(xiàng)目 就會(huì)顯示結(jié)果了



gjy 2010-07-01 15:52 發(fā)表評(píng)論
]]>
Struts2+Hibernate3.2+Spring2.0整合http://www.aygfsteel.com/gjynewer/articles/324913.htmlgjygjyWed, 30 Jun 2010 09:22:00 GMThttp://www.aygfsteel.com/gjynewer/articles/324913.htmlhttp://www.aygfsteel.com/gjynewer/comments/324913.htmlhttp://www.aygfsteel.com/gjynewer/articles/324913.html#Feedback0http://www.aygfsteel.com/gjynewer/comments/commentRss/324913.htmlhttp://www.aygfsteel.com/gjynewer/services/trackbacks/324913.html1:添加hibernate3.2的支持
選擇hibernate3.2 Annotations 和core Libraries的勾打上
  hibernate.cfg.xml放到src下
去掉勾 specify database connection details 交給spring去管理
去掉勾 create SessionFactory class

2:添加Spring2.0的支持
添加如下前4個(gè)jar文件和1個(gè)
  AOP, Core, Persistence Core,Persistence jdbc
  Spring2.0 Web Libraries
WEB-INF下生成一個(gè)applicationContext.xml
去掉勾 create Spring SessionFactory that references

3:添加struts2的支持
  src下放struts.xml文件
 
4:創(chuàng)建一個(gè)users表
自動(dòng)有id firstname lastname age;

5:index.jsp
<s:a href="save.jsp">save user</s:a><br/>

<s:a href="listUser.action">List User</s:a><br/>

6:save.jsp(可以考慮國(guó)際化)
<s:form action="saveUser">
 <s:textfield name="user.firstname" label="firstname"></s:textfield>
 <s:textfield name="user.lastname" label="lastname"></s:textfield>
        <s:textfield name="user.age" label="age"></s:textfield>
 <s:submit></s:submit>
</s:form>

7:package com.test.bean
public class User{
  private Integer id;
  private String firstname;
  private String lastname;
  private int age;
}
建立User.hbm.xml文件
<hibernate-mapping>
 <class name="com.test.bean.User" tables="users">
   <id name="id" type="java.lang.Integer" column="id">
 <generator class="increment"></generator>
   </id>
   <property name="firstname" type="string" length="50"/>
   <property name="lastname" type="string" length="50"/>
    <property name="age" type="java.lang.Integer"/>
 </class>
</hibernate-mapping>


8:com.test.action.user
public class SaveUserAction extends ActionSupport implements ModelDriven{
  private User user=new User();
  //生成getters,setters方法
  public String execute() throws Exception{
 
  }
}

9:save.jsp添加國(guó)際化支持
 src下建立一個(gè)struts.properties,內(nèi)容如下
#國(guó)際化資源文件的前綴 globalMessages
 struts.custom.i18n.resources=globalMessages
定義2個(gè)國(guó)際化文件
 src下新建globalMessages_en.properties 英文的國(guó)際化文件
  firstname=firstname
  lastname=lastname
  age=age
src下新建globalMessages_zh.properties 中文的國(guó)際化文件
 firstname=姓的ascii
  lastname=名的ascii
  age=年齡的ascii
 然后修改save.jsp(getText方法可以得到國(guó)際化文件中的值)
 <s:form action="saveUser">
 <s:textfield name="user.firstname" label="%{getText('firstname'}"></s:textfield>
 <s:textfield name="user.lastname" label="%{getText('lastname'}"></s:textfield>
        <s:textfield name="user.age" label="%{getText('age'}"></s:textfield>
 <s:submit></s:submit>
</s:form>
 重新啟動(dòng)項(xiàng)目,看看國(guó)際化起不起作用


10:SaveUserAction 中要調(diào)用業(yè)務(wù)層的保存方法,業(yè)務(wù)層的保存方法要調(diào)用數(shù)據(jù)層
 所以要寫業(yè)務(wù)層與數(shù)據(jù)訪問層的代碼

11:package com.test.dao
   public interface UserDAO{
 public void saveUser(User user);
 public viod removeUser(User user);
 public User findUserById(Integer id);
 public List<User> findAllUsers();   
 public void updateUser(User user);
}

12:package com.test.dao.impl//(沒有使用事務(wù),因?yàn)榫筒僮鲾?shù)據(jù)庫一次)
public class UserDAOImpl extends HibernateDaoSupport implements UserDAO{
 public void saveUser(User user){
   this.getHibernateTemplate().save(user);
 }
 public viod removeUser(User user){
   this.getHibernateTemplate().delete(user);
 }
 public User findUserById(Integer id){
   User user=(User)this.getHibernateTemplate().get(User.class,id);
   return user;
 }
 @SuppressWarnings("unchecked")
 public List<User> findAllUsers(){
   String hql="from User user order by user.id desc";
   return (List<User>)this.getHibernateTemplate().find(hql);
 }   
 public void updateUser(User user){
   this.getHibernateTemplate().update(user);
 }
}


13:package com.test.service
   public interface UserService{
    public void save(User user);
 public viod delete(User user);
 public User findById(Integer id);
 public List<User> findAll();   
 public void update(User user);
}

14:package com.test.service.impl
  public class UserServiceImpl implements UserService{
 private UserDAO userDao;//生成setters方法
 public void save(User user){
   userDao.saveUser(user);//在saveUser方法上ctrl+t
 }
 public viod delete(User user){
   this.userDao.removeUser(user);
 }
 public User findById(Integer id){
   return userDao.findUserById(id);
 }
 public List<User> findAll(){
  return userDao.findAllUsers();
 }   
 public void update(User user){
  this.userDao.updateUser(user);
 }
}

15:回到SaveUserAction中
 private UserService service;//生成setters方法,
 public String execute() throws Exception{
  this.service.save(user);
  return SUCCESS;
 }
16:現(xiàn)在代碼已經(jīng)編寫玩了,但是還不能運(yùn)行
   因?yàn)槲覀冞€沒有寫配置文件,里面要寫依賴關(guān)系與注入關(guān)系

17:struts.xml
   <struts>
 <package name="user" extends="struts-default">
  <action name="saveUser" class="saveUserAction"> //saveUserAction 為spring中配置文件里面的id
   <result name="success" type="redirect">listUser</result>
   <result name="input">/save.jsp</result>
  </action>
 </package>
   </struts>


18:applicationContext.xml
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
 <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
 <property name="url" value="jdbc:mysql://localhost:3306/mytest"></property>
 <property name="username" value="root"></property>
 <property name="password" value="root"></property>
 <property name="maxActive" value="100"></property>連接池中最大100個(gè)連接
 <property name="maxIdle" value="30"></property>連接池最大有30個(gè)空閑的連接
 <property name="maxWait" value="500"></property>
 <property name="defaultAutoCommit" value="true"></property>每執(zhí)行完一次數(shù)據(jù)操作就執(zhí)行事務(wù)
</bean>

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
 <property name="dataSource" ref="dataSource"></property>
 <property name="hibernateProperties">
  <props>
   <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
   <prop key="hibernate.show_sql">true</prop>
  </props>
 </property>
 <property name="mappingResources">
  <list>
   <value>com/test/bean/User.hbm.xml</value>
  </list>
 </property>
</bean>

對(duì)于沒有狀態(tài)的bean bean設(shè)置為singleton(單例)
spring中的singleton 對(duì)于ioc容器只生成一個(gè)實(shí)例
<bean id="userDao" class="com.test.dao.impl.UserDAOImpl" scope="singleton">
 <property name="sessionFactory">
  <ref bean="sessionFactory"/>
 </property>
</bean>

<bean id="userService" class="com.test.service.impl.UserServiceImpl">
 <property name="userDao" ref="userDao"></property>
</bean>
對(duì)于有狀態(tài)的bean bean設(shè)置為prototype
<bean id="saveUserAction" class="com.test.action.user.SaveUserAction" scope="prototype">
 <property name="service" ref="userService"></property>
</bean>

<bean id="listUserAction" class="com.test.action.user.ListUserAction" scope="prototype">
 <property name="service" ref="userService"></property>
</bean>

<bean id="removeUserAction" class="com.test.action.user.RemoveUserAction" scope="prototype">
 <property name="service" ref="userService"></property>
</bean>
19:運(yùn)行項(xiàng)目 會(huì)報(bào)錯(cuò)
  說沒有這樣的方法的異常。這是原因是jar的沖突
  把a(bǔ)sm-2.2.3.jar 這個(gè)jar包刪除
   再運(yùn)行項(xiàng)目,應(yīng)該就不會(huì)報(bào)錯(cuò)了
20:完成ListUserAction 顯示所有用戶
 public class ListUser Action extends ActionSupport implements RequestAware{
 private Map<String,Object> request;//有setters方法
 private UserService service;//生成setters方法,
 public String execute() throws Exception{
  //this.service.findAll();
   request.put("list",this.service.findAll());
 return SUCCESS;
 }
}

21:寫list.jsp 顯示所有的用戶信息
<s:iterator value="#request.list" id="us">
     <tr>
      <td><s:property value="#us.id"/>
      </td>
      
      <td><s:property value="#us.firstname"/>
      </td>
      
      <td><s:property value="#us.lastname"/>
      </td>
      
      <td><s:property value="#us.age"/>
      </td>
      
      <td><s:a href="deleteUser.action?user.id=%{#us.id}" onclick="return del();">delete</s:a>
      </td>
      
      <td><s:a href="updatePUser.action?user.id=%{#us.id}">update</s:a>
      </td>
     
     
     
     </tr>
</s:iterator>

作業(yè):

1. 完成save user頁面的輸入校驗(yàn)(姓不能為空,名不能為空,年齡不能為空且在1—150之間),采用代碼的方式完成(override validate方法),采用校驗(yàn)框架的方式完成(有兩種辦法)

2. 當(dāng)校驗(yàn)框架驗(yàn)證失敗時(shí),看看有什么情況發(fā)生。


22:在save.jsp中 進(jìn)行數(shù)據(jù)校驗(yàn)SaveUserAction-validation.xml
  <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">

<validators>
 <field name="user.firstname">
  <field-validator type="requiredstring">
   <message>required first name</message>
  </field-validator>
 </field>
 
 <field name="user.lastname">
  <field-validator type="requiredstring">
   <message>required last name</message>
  </field-validator>
 </field>
 
 <field name="user.age">
  <field-validator type="required">
   <message>required age</message>
  </field-validator>
  <field-validator type="int">
   <param name="min">1</param>
   <param name="max">150</param>
   <message>age should be between ${min} and ${max}</message>
  </field-validator>
 </field>
 
</validators>

還可以寫第2種校驗(yàn)方式
SaveUserAction-validation.xml
  <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">

<validators>
 <field name="user">
  <field-validator type="visitor"> visitor 需要通過另外的文件進(jìn)行校驗(yàn)
   <param name="context">user</param>另外的文件的名字為user
   <param name="appendPrefix">true</param> 錯(cuò)誤的前綴信息大部分都相同
   <message>user's </message> 錯(cuò)誤的前綴
  </field-validator>
 </field>
</validators>

另外的校驗(yàn)文件放在哪里呢?(我們這里要校驗(yàn)User類,所以這個(gè)文件必須放在User.java相同的包名)
取名為類名-context的名字-validation.xml 例如 User-user-validation.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">

<validators>
 <field name="firstname">
  <field-validator type="requiredstring">
   <message>required first name</message>
  </field-validator>
 </field>

 <field name="lastname">
  <field-validator type="requiredstring">
   <message>required last name</message>
  </field-validator>
 </field>

 <field name="age">
  <field-validator type="required">
   <message>required age</message>
  </field-validator>
  <field-validator type="int">
   <param name="min">1</param>
   <param name="max">150</param>
   <message>age should be between ${min} and ${max}</message>
  </field-validator>
 </field>

</validators>


這2種校驗(yàn)方式,建議采取第1種。


當(dāng)校驗(yàn)框架驗(yàn)證失敗時(shí)(如果什么都不填,肯定會(huì)出現(xiàn)錯(cuò)誤信息),這時(shí)候,我反復(fù)提交,此時(shí)
錯(cuò)誤信息會(huì)隨著提交次數(shù)的增加,錯(cuò)誤信息也會(huì)增加。
怎么解決這個(gè)問題呢?
原因:
當(dāng)我們客戶端每次請(qǐng)求action的時(shí)候,Action類都會(huì)產(chǎn)生一個(gè)實(shí)例,每個(gè)實(shí)例都是有狀態(tài)的。
都會(huì)保存自己的狀態(tài)信息(錯(cuò)誤信息)。但是現(xiàn)在的情況下,每次請(qǐng)求的時(shí)候,Action類只
產(chǎn)生一個(gè)實(shí)例,所有請(qǐng)求都只對(duì)應(yīng)一個(gè)實(shí)例,所以所有的錯(cuò)誤信息都附加在這個(gè)實(shí)例上。
所以會(huì)輸出很多錯(cuò)誤信息的。
因?yàn)槭窃趕pring中的設(shè)置形成的(這樣設(shè)置會(huì)每次請(qǐng)求都只會(huì)對(duì)應(yīng)一個(gè)實(shí)例)
<bean id="saveUserAction" class="com.test.action.user.SaveUserAction">
 <property name="service" ref="userService"></property>
</bean>
這樣設(shè)置就表示這個(gè)action 所有請(qǐng)求都只有一個(gè)實(shí)例

所以要改成這樣(保證每次請(qǐng)求都會(huì)產(chǎn)生一個(gè)實(shí)例)
<bean id="saveUserAction" class="com.test.action.user.SaveUserAction" scope="prototype">
 <property name="service" ref="userService"></property>
</bean>


23:刪除一個(gè)用戶

24:更新用戶

25:將用戶列表已excel的格式顯示出來
需要用到poi組件
要完成將用戶列表顯示在excel中,需要完成3步
a:將數(shù)據(jù)讀出來
b:把數(shù)據(jù)寫道excel中
c:把這個(gè)excel文件在瀏覽器中可以下載

在UserService接口中增加一個(gè)方法
public InputStream getInputStream();
在UserServiceImpl中實(shí)現(xiàn)上面的方法

public InputStream getInputStream(){
 HSSFWorkbook wb = new HSSFWorkbook();
  //創(chuàng)建一個(gè)工作簿
  HSSFSheet sheet = wb.createSheet("sheet1");

  HSSFRow row = sheet.createRow(0);

  HSSFCell cell = row.createCell((short) 0);
  cell.setEncoding(HSSFCell.ENCODING_UTF_16);
  cell.setCellValue("序號(hào)");

  cell = row.createCell((short) 1);
  cell.setEncoding(HSSFCell.ENCODING_UTF_16);
  cell.setCellValue("姓");

  cell = row.createCell((short) 2);
  cell.setEncoding(HSSFCell.ENCODING_UTF_16);
  cell.setCellValue("名");

  cell = row.createCell((short) 3);
  cell.setEncoding(HSSFCell.ENCODING_UTF_16);
  cell.setCellValue("年齡");

  List<User> list = this.findAll();

  for (int i = 0; i < list.size(); ++i)
  {
   User user = list.get(i);

   row = sheet.createRow(i + 1);

   cell = row.createCell((short) 0);
   cell.setEncoding(HSSFCell.ENCODING_UTF_16);
   cell.setCellValue(i + 1);

   cell = row.createCell((short) 1);
   cell.setEncoding(HSSFCell.ENCODING_UTF_16);
   cell.setCellValue(user.getFirstname());

   cell = row.createCell((short) 2);
   cell.setEncoding(HSSFCell.ENCODING_UTF_16);
   cell.setCellValue(user.getLastname());

   cell = row.createCell((short) 3);
   cell.setEncoding(HSSFCell.ENCODING_UTF_16);
   cell.setCellValue(user.getAge());
  }

  File file = new File("test.xls");

  try
  {
   OutputStream os = new FileOutputStream(file);
   wb.write(os);//使用輸出流把數(shù)據(jù)寫道test.xls中
   os.close();
  }
  catch (Exception e)
  {
   e.printStackTrace();
  }

  InputStream is = null;
  try
  {
   is = new FileInputStream(file);
  }
  catch (FileNotFoundException e)
  {
   e.printStackTrace();
  }

  return is;
}

package com.test.action.user;
//產(chǎn)生下載excel的action
public class GenerateExcelAction extends ActionSupport
{
 private UserService service;

 public UserService getService()
 {
  return service;
 }

 public void setService(UserService service)
 {
  this.service = service;
 }
 
 public InputStream getDownloadFile()//這個(gè)方法名必須與struts.xml中的inputName相同
 {
  return this.service.getInputStream();
 }
 
 @Override
 public String execute() throws Exception
 {
  return SUCCESS;
 }
}

struts.xml中配置
AllUsers.xls的名字為準(zhǔn),前面的xls名字隨便取
<action name="generateExcel" class="generateExcelAction">
   <result name="success" type="stream"> stream表示二進(jìn)制
    <param name="contentType">application/vnd.ms-excel</param>
    <param name="contentDisposition">filename="AllUsers.xls"</param>
    <param name="inputName">downloadFile</param>
   </result>
</action>
在list.jsp中
<s:a href="generateExcel.action">下載excel</s:a>



gjy 2010-06-30 17:22 發(fā)表評(píng)論
]]>
主站蜘蛛池模板: 临朐县| 涿州市| 历史| 京山县| 墨玉县| 贵南县| 江源县| 龙门县| 方山县| 法库县| 抚顺县| 瑞安市| 济南市| 德安县| 项城市| 九龙县| 南阳市| 西华县| 仙居县| 宝清县| 亳州市| 哈巴河县| 华坪县| 布拖县| 永丰县| 额济纳旗| 定日县| 永修县| 华坪县| 集安市| 旺苍县| 清河县| 仙桃市| 彰化市| 淳安县| 湘阴县| 台中市| 敦化市| 安陆市| 隆安县| 茂名市|