熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

Struts2通配符映射

2013-11-23 20:10:51  來源: Java開源技術 
struts的關於method={}意思詳解
  <action   name= Login_*    method= {}    class= mailreaderLogin >
  中Login_*帶*是什麼意思?method= {} 帶{}這個是什麼意思?
  ====================================================
  name= Login_*
  代表這個action處理所有以Login_開頭的請求
  method= {}
  根據前面請求Login_methodname調用action中的以methodname命名的方法
  class= mailreaderLogin
  action的類名稱
  如jsp文件中請求Login_validateUser的action名稱根據上面配置調用action類mailreaderLogin類中方法validateUser()
  又如
  對於Login_update請求將會調用mailreaderLogin的update()方法
  它的用法同webwork中的!符號的作用相當於是一個通配符
  +++++++++++++++++++++++++++++++++++++++++++++++++++++++
  struts中的路徑問題
  注意在jsp中/表示tomcat服務器的根目錄在strutsxml配置文件中/表示webapp的根路徑即MyEclipse web項目中的WebRoot路徑
  總結
  struts中的路徑問題是根據action的路徑而不是jsp路徑來確定所以盡量不要使用相對路徑
  雖然可以用redirect方式解決但redirect方式並非必要
  解決辦法非常簡單統一使用絕對路徑 (在jsp中用requestgetContextRoot方式來拿到webapp的路徑)
  或者使用myeclipse經常用的指定basePath
  Action Method


  配置
  <package name=user extends=strutsdefault namespace=/user>
  <action name=userAdd class=combjsxtstrutsuseractionUserAction method=add>
  <result>/user_add_successjsp</result>
  </action>
  <action name=user class=combjsxtstrutsuseractionUserAction>
  <result>/user_add_successjsp</result>
  </action>
  </package>
  總結
  Action執行的時候並不一定要執行execute方法
  可以在配置文件中配置Action的時候用method=來指定執行哪個方法(前者方法)
  也可以在url地址中動態指定(動態方法調用DMI )(推薦)(後者方法)
  <a <%=context %>/user/userAdd>添加用戶
  <br />
  <a <%=context %>/user/user!add>添加用戶
  <br />
  前者會產生太多的action所以不推薦使用(注<% String context = requestgetContextPath(); %>)
  再給個案例大概介紹!使用動態調用DMI的方法即通過!+方法名的指定方法
  UserActionjava
  import comopensymphonyxworkActionContext;
  import javautilMap;
  public class UserAction {
  private String userName;
  private String password;
  public String getUserName() {
  return userName;
  }
  public void setUserName(String userName) {
  thisuserName = userName;
  }
  public String getPassword() {
  return password;
  }
  public void setPassword(String password) {
  thispassword = password;
  }
  public String execute(){
  if(!userNameequals(aa)||!passwordequals(aa)){
  return error;
  }else{
  Map session=(Map)ActionContextgetContext()getSession();
  sessionput(userName userName);
  return success;
  }
  }
  public String loginOther(){
  if(!userNameequals(bb)||!passwordequals(bb)){
  return error;
  }else{
  Map session=(Map)ActionContextgetContext()getSession();


  sessionput(userName userName);
  return success;
  }
  }
  }
  strutsxml
  <?xml version= encoding=UTF?>
  <!DOCTYPE struts PUBLIC
  //Apache Software Foundation//DTD Struts Configuration //EN
  dtd>
  <struts>
  <package name=default extends=strutsdefault>
  <action name=struts class=orgactionStrutsAction>
  <result name=success>/welcomejsp</result>
  <result name=error>/hellojsp</result>
  <result name=input>/hellojsp</result>
  </action>
  <action name=user class=orgactionUserAction>
  <result name=success>/login_welcomejsp</result>
  <result name=error>/login_errorjsp</result>
  </action>
  <!<action name=loginOther class=orgactionUserAction method=loginOther>
  <result name=success>/login_welcomejsp</result>
  <result name=error>/login_errorjsp</result>
  </action>
  >
  </package>
  </struts>
  login_welcomejsp
  <%@ page language=java import=javautil* pageEncoding=utf%>


  <%@ taglib uri=/strutstags prefix=s %>
  <!DOCTYPE HTML PUBLIC //WC//DTD HTML Transitional//EN>
  <html>
  <head>
  <title>歡迎</title>
  <meta httpequiv=pragma content=nocache>
  <meta httpequiv=cachecontrol content=nocache>
  <meta httpequiv=expires content=>
  <meta httpequiv=keywords content=keywordkeywordkeyword>
  <meta httpequiv=description content=This is my page>
  <!
  <link rel=stylesheet type=text/css >
  >
  </head>
  <body>
  <s:set value=#sessionuserName name=userName />
  你好!<s:property value=#userName/>
  </body>
  </html>
  login_errorjsp
  <%@ page language=java import=javautil* pageEncoding=UTF%>
  <!DOCTYPE HTML PUBLIC //WC//DTD HTML Transitional//EN>
  <html>
  <head>
  <title>登陸失敗</title>
  <meta httpequiv=pragma content=nocache>
  <meta httpequiv=cachecontrol content=nocache>


  <meta httpequiv=expires content=>
  <meta httpequiv=keywords content=keywordkeywordkeyword>
  <meta httpequiv=description content=This is my page>
  <!
  <link rel=stylesheet type=text/css >
  >
  </head>
  <body>
  很抱歉!你的登陸失敗了!請重新<a >登陸
  </body>
  </html>
  loginjsp
  <%@ page language=java import=javautil* pageEncoding=utf%>
  <%@ taglib uri=/strutstags prefix=s %>
  <%
  String path = requestgetContextPath();
  String basePath = requestgetScheme()+://+requestgetServerName()+:+requestgetServerPort()+path+/;
  %>
  <!DOCTYPE HTML PUBLIC //WC//DTD HTML Transitional//EN>


  <html>
  <head>
  <base <%=basePath%>>
  <title>struts 應用</title>
  <meta httpequiv=pragma content=nocache>
  <meta httpequiv=cachecontrol content=nocache>
  <meta httpequiv=expires content=>
  <meta httpequiv=keywords content=keywordkeywordkeyword>
  <meta httpequiv=description content=This is my page>
  <!
  <link rel=stylesheet type=text/css >
  >
  </head>
  <body>
  <s:form  action=user!loginOther method=post> 紅色部分你如果想調用userAction中的loginOther方法而不想調用execute方法 直接通過 !+方法名即可那你就不用再設置strutsxml中注釋掉的部分了這樣可以不產生太多的action
  <s:textfield name=userName label=請輸入姓名 ></s:textfield> <s:textfield name=password label=請輸入密碼></s:textfield>
  <s:submit value=提交></s:submit>
  </s:form>
  </body>
  </html>
  Action Wildcard(Action 通配符)


  配置
  <package name=actions extends=strutsdefault namespace=/actions>
  <action name=Student* class=combjsxtstrutsactionStudentAction method={}>
  <result>/Student{}_successjsp</result>
  </action>
  <action name=*_* class=combjsxtstrutsaction{}Action method={}>
  <result>/{}_{}_successjsp</result>
  <! {}_successjsp >
  </action>
  </package>
  {}{}表示第一第二個占位符
  *為通配符
  通過action name的通配匹配獲得占位符可以使用占位符放在result和methodclass中替代匹配的字符
  總結
  使用通配符將配置量降到最低
  <a <%=context %>/actions/Studentadd>添加學生
  <a <%=context %>/actions/Studentdelete>刪除學生
  不過一定要遵守約定優於配置的原則
  <a <%=context %>/actions/Teacher_add>添加老師
  <a <%=context %>/actions/Teacher_delete>刪除老師
  <a <%=context %>/actions/Course_add>添加課程
  <a <%=context %>/actions/Course_delete>刪除課程


  接收參數值
  使用action屬性接收參數
  只需在action加入getter/setter方法如參數name=a接受到參數必須有getName/setName方法
  鏈接<a user/user!add?name=a&age=>
  public class UserAction extends ActionSupport {
  private String name;
  private int age;
  public String add() {
  Systemoutprintln(name= + name);
  Systemoutprintln(age= + age);
  return SUCCESS;
  }
  public String getName() {
  return name;
  }
  public void setName(String name) {
  thisname = name;
  }
  public int getAge() {
  return age;
  }
  public void setAge(int age) {
  thisage = age;
  }
  }


  使用Domain Model接收參數
  將之前的屬性放入到POJO 並設置屬性的setter/getter方法
  鏈接使用Domain Model接收參數<a user/user!add?username=a&userage=>添加用戶
  public class UserAction extends ActionSupport {
  private User user;
  //private UserDTO userDTO;
  public String add() {
  Systemoutprintln(name= + usergetName());
  Systemoutprintln(age= + usergetAge());
  return SUCCESS;
  }
  public User getUser() {
  return user;
  }
  public void setUser(User user) {
  thisuser = user;
  }
  }
  public class User {
  private String name;
  private int age;
  public String getName() {
  return name;
  }
  public void setName(String name) {
  thisname = name;
  }
  public int getAge() {
  return age;
  }
  public void setAge(int age) {
  thisage = age;
  }
  }


  使用ModelDriven接收參數
  Action實現ModelDriven接口實現getModel()方法
  這樣user需要自己new出來getModel返回user
  鏈接使用ModelDriven接收參數<a user/user!add?name=a&age=>添加用戶
  public class UserAction extends ActionSupport implements ModelDriven<User> {
  private User user = new User();
  public String add() {
  Systemoutprintln(name= + usergetName());
  Systemoutprintln(age= + usergetAge());
  return SUCCESS;
  }
  @Override
  public User getModel() {
  return user;
  }
  }
  字符編碼
  配置
  <constant name=strutsinencoding value=GBK /> <! internationalization >
  在struts中不起作用屬於bug在struts中修改


  解決方案
  修改webxml 中
  <filter>
  <filtername>struts</filtername>
  <! struts中使用filter >
  <!<filterclass>orgapachestrutsdispatcherngfilterStrutsPrepareAndExecuteFilter</filterclass>>
  <! struts中使用的filter >
  <filterclass>orgapachestrutsdispatcherFilterDispatcher</filterclass>
  </filter>
  =============================================================
  Struts一個Action內包含多個請求處理方法的處理(三種方式)
  Struts提供了DispatchAction從而允許一個Action內包含多個請求處理方法Struts也提供了類似的功能處理方式主要有以下三種方式
   動態方法調用
  DMIDynamic Method Invocation 動態方法調用
  動態方法調用是指表單元素的action不直接等於某個Action的名字而是以如下形式來指定對應的動作名
  <form method=post action=userOpt!loginaction>
  則用戶的請求將提交到名為userOpt的Action實例Action實例將調用名為login方法來處理請求同時login方法的簽名也是跟execute()一樣即為public String login() throws Exception
  注意要使用動態方法調用必須設置Struts允許動態方法調用通過設置strutsenableDynamicMethodInvocation常量來完成該常量屬性的默認值是true
      示例
  修改用戶登錄驗證示例多增加一個注冊用戶功能
      修改Action類
  package orgqiujywebstrutsaction;
  import comopensymphonyxworkActionContext;
  import comopensymphonyxworkActionSupport;
  /**
  *@authorqiujy
  *@version
  */
  publicclass LoginAction extends ActionSupport{
  private String userName;
  private String password;
  private String msg; //結果信息屬性


From:http://tw.wingwit.com/Article/program/Java/ky/201311/28083.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.