2008-10-06 15 views
26

मैं अपने स्ट्रूट्स 2 ऐप को जेनरेट किए गए यूआरएल पर रीडायरेक्ट करने की कोशिश कर रहा हूं। इस मामले में, मैं चाहता हूं कि यूआरएल वर्तमान तिथि, या डेटाबेस में देखी गई तारीख का उपयोग करे। तो /section/document/section/document/2008-10-06स्ट्रैट्स 2 में डायनामिक यूआरएल रीडायरेक्ट कैसे करें?

ऐसा करने का सबसे अच्छा तरीका क्या है?

उत्तर

58

यहाँ हम इसे कैसे करते हैं OGNL का उपयोग कर अपने struts.xml में किसी भी चर के लिए गतिशील मान सेट करने के लिए तकनीक। हमने सभी प्रकार के गतिशील परिणामों को बनाया है जिनमें रीस्टफुल लिंक जैसे सामान शामिल हैं। सुन्दर सामान।

+1

धन्यवाद एक बहुत, कि अच्छी तरह से काम करता है! क्या एक्सएमएल में बदलाव करने का कोई तरीका है ताकि मुझे प्रत्येक कार्यवाही पर लागू करने की आवश्यकता न हो? मैं आदर्श रूप से ऐसा करना चाहता हूं कि यह मेरे सभी कार्यों पर लागू हो। – Chris

+2

आप वैश्विक परिणाम आज़मा सकते हैं। मैंने गतिशील चर के लिए इसका प्रयोग नहीं किया है, लेकिन जब तक कार्रवाई परिणाम लौटाती है, मुझे कोई कारण नहीं दिखता है कि यह काम नहीं करेगा। –

+0

इस काम के लिए वैश्विक परिणाम ठीक है। –

2

मैंने super.doExecute() पर कॉल करने से पहले अपने तर्क करने के लिए स्ट्रैट्स ServletRedirectResult उप-वर्ग को समाप्त कर दिया और doExecute() विधि को ओवरराइड कर दिया। ऐसा लगता है:

public class AppendRedirectionResult extends ServletRedirectResult { 
    private DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); 

    @Override 
    protected void doExecute(String finalLocation, ActionInvocation invocation) throws Exception { 
    String date = df.format(new Date()); 
    String loc = "/section/document/"+date; 
    super.doExecute(loc, invocation); 
    } 
} 

मुझे यकीन नहीं है कि यह करने का यह सबसे अच्छा तरीका है, लेकिन यह काम करता है।

Struts.xml में, इस तरह के रूप में एक गतिशील परिणाम है:

<result name="redirect" type="redirect">${url}</result> 

कार्रवाई में:

private String url; 

public String getUrl() 
{ 
return url; 
} 

public String execute() 
{ 
[other stuff to setup your date] 
url = "/section/document" + date; 
return "redirect"; 
} 

आप वास्तव में यह एक ही उपयोग कर सकते हैं

14

एक भी struts.xml में दोहराव से बचने के लिए विन्यास annotations और कन्वेंशन प्लग-इन का उपयोग कर सकते हैं:

@Result(location="${url}", type="redirect") 

$ {url} का मतलब

+0

धन्यवाद! मुझे जिस चीज की जरूरत थी। – Nate

2

"getUrl विधि के मूल्य का उपयोग" किसी को भी ActionClass में सीधे पुनर्निर्देशित करना चाहता है:

public class RedirecActionExample extends ActionSupport { 
HttpServletResponse response=(HttpServletResponse) ActionContext.getContext().get(ServletActionContext.HTTP_RESPONSE); 

    url="http://localhost:8080/SpRoom-1.0-SNAPSHOT/"+date; 
    response.sendRedirect(url); 
    return super.execute(); 
} 

संपादित करें: एक लापता बोली जोड़ा गया।

+0

एक्शन क्लास के अंदर रीडायरेक्ट करने के फायदे या नुकसान क्या हैं, इसके बजाय struts.xml का उपयोग कर रहे हैं? मैं पहले से ही एक अंतर देख सकता हूं: स्ट्रेट्स का उपयोग करके।एक्सएमएल, रीडायरेक्टिंग वास्तव में वापस दो पूरी तरह से अलग अनुरोध है, जबकि आपका समाधान केवल एक अनुरोध है? – user1884155

1

आप एनोटेशन का उपयोग कर एक और कार्रवाई रीडायरेक्ट कर सकते हैं -

@Result(
    name = "resultName", 
    type = "redirectAction", 
    params = { "actionName", "XYZAction" } 
) 
0

एक जो करने के लिए कार्रवाई शामिल है संबंध के बिना एक इंटरसेप्टर से सीधे अनुप्रेषित कर सकते हैं।

struts.xml

<global-results> 
     <result name="redir" type="redirect">${#request.redirUrl}</result> 
    </global-results> 

में इंटरसेप्टर

में
@Override 
public String intercept(ActionInvocation ai) throws Exception 
{ 
    final ActionContext context = ai.getInvocationContext();   
    HttpServletRequest request = (HttpServletRequest)context.get(StrutsStatics.HTTP_REQUEST); 
    request.setAttribute("redirUrl", "http://the.new.target.org"); 
    return "redir"; 
}