क्या आप मुझे इस कोड का स्प्रिंग mvc स्टाइल एनालॉग लिखने में मदद कर सकते हैं?
session.setAttribute("name","value");
और @ModelAttribute
सत्र को एनोटेशन द्वारा एनोटेट किया गया एक तत्व कैसे जोड़ें और फिर उस तक पहुंच प्राप्त करें?
क्या आप मुझे इस कोड का स्प्रिंग mvc स्टाइल एनालॉग लिखने में मदद कर सकते हैं?
session.setAttribute("name","value");
और @ModelAttribute
सत्र को एनोटेशन द्वारा एनोटेट किया गया एक तत्व कैसे जोड़ें और फिर उस तक पहुंच प्राप्त करें?
जवाबों:
यदि आप प्रत्येक प्रतिक्रिया के बाद ऑब्जेक्ट को हटाना चाहते हैं, तो आपको सत्र की आवश्यकता नहीं है,
यदि आप उपयोगकर्ता सत्र के दौरान ऑब्जेक्ट रखना चाहते हैं, तो कुछ तरीके हैं:
सत्र में सीधे एक विशेषता जोड़ें:
@RequestMapping(method = RequestMethod.GET)
public String testMestod(HttpServletRequest request){
ShoppingCart cart = (ShoppingCart)request.getSession().setAttribute("cart",value);
return "testJsp";
}
और आप इसे इस तरह नियंत्रक से प्राप्त कर सकते हैं:
ShoppingCart cart = (ShoppingCart)session.getAttribute("cart");
अपने नियंत्रक सत्र को स्कूप करें
@Controller
@Scope("session")
ऑब्जेक्ट्स को स्कोप करें, उदाहरण के लिए आपके पास उपयोगकर्ता ऑब्जेक्ट है जो हर बार सत्र में होना चाहिए:
@Component
@Scope("session")
public class User
{
String user;
/* setter getter*/
}
फिर प्रत्येक नियंत्रक में वर्ग इंजेक्ट करें जो आप चाहते हैं
@Autowired
private User user
जो सत्र पर कक्षा रखता है।
AOP प्रॉक्सी इंजेक्शन: स्प्रिंग -xml में:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.1.xsd">
<bean id="user" class="com.User" scope="session">
<aop:scoped-proxy/>
</bean>
</beans>
फिर प्रत्येक नियंत्रक में वर्ग इंजेक्ट करें जो आप चाहते हैं
@Autowired
private User user
5.Pass HttpSession विधि करने के लिए:
String index(HttpSession session) {
session.setAttribute("mySessionAttribute", "someValue");
return "index";
}
6.Make ModelAttribute in session द्वारा @SessionAttributes ("ShoppingCart"):
public String index (@ModelAttribute("ShoppingCart") ShoppingCart shoppingCart, SessionStatus sessionStatus) {
//Spring V4
//you can modify session status by sessionStatus.setComplete();
}
या आप मॉडल को संपूर्ण नियंत्रक वर्ग में जोड़ सकते हैं जैसे,
@Controller
@SessionAttributes("ShoppingCart")
@RequestMapping("/req")
public class MYController {
@ModelAttribute("ShoppingCart")
public Visitor getShopCart (....) {
return new ShoppingCart(....); //get From DB Or Session
}
}
हर एक को फायदा और नुकसान है:
@ सत्र क्लाउड सिस्टम में अधिक मेमोरी का उपयोग कर सकता है यह सत्र को सभी नोड्स में कॉपी करता है, और प्रत्यक्ष विधि (1 और 5) में गड़बड़ दृष्टिकोण है, यह यूनिट टेस्ट के लिए अच्छा नहीं है।
सत्र jsp तक पहुँचने के लिए
<%=session.getAttribute("ShoppingCart.prop")%>
Jstl में:
<c:out value="${sessionScope.ShoppingCart.prop}"/>
थाइमेलफ में:
<p th:text="${session.ShoppingCart.prop}" th:unless="${session == null}"> . </p>
User
बीन को इंजेक्ट करना केवल तभी काम करेगा जब आप बीन को क्लास में बुला रहे हैं session
, यह भी स्कोप किया गया है, अन्यथा यदि कोई सत्र मौजूद नहीं है, तो यह अपवाद को फेंकता है क्योंकि संदर्भ में कोई सक्रिय सत्र नहीं होगा @runtime जब हम user
बीन को इंजेक्ट करते हैं I !!
उपयोग @SessionAttributes
डॉक्स देखें: अनुरोधों के बीच HTTP सत्र में मॉडल विशेषताओं को संग्रहीत करने के लिए @SessionAttributes का उपयोग करना
" स्प्रिंग एमवीसी मॉडल और सत्र विशेषताओं को समझना " भी स्प्रिंग एमवीसी सत्रों का एक बहुत अच्छा अवलोकन देता है और बताता है कि कैसे / जब @ModelAttribute
सत्र में स्थानांतरित किया जाता है (यदि नियंत्रक @SessionAttributes
एनोटेट है)।
यह लेख यह भी बताता है कि @SessionAttributes
HttpSession पर सीधे विशेषताओं को सेट करने के बजाय मॉडल पर उपयोग करना बेहतर है क्योंकि यह स्प्रिंग एमवीसी को दृश्य-अज्ञेयवादी बनाने में मदद करता है।
SessionAttribute
अनुरोध ऑब्जेक्ट और सेटिंग विशेषता से सत्र प्राप्त करने के बजाय एनोटेशन सबसे सरल और सीधे आगे है।
किसी भी वस्तु को नियंत्रक में मॉडल में जोड़ा जा सकता है और सत्र में संग्रहीत किया जाएगा यदि उसका नाम @SessionAttributes
एनोटेशन में तर्क के साथ मेल खाता है ।
नीचे उदाहरण के लिए, personObj
सत्र में उपलब्ध होगा।
@Controller
@SessionAttributes("personObj")
public class PersonController {
@RequestMapping(value="/person-form")
public ModelAndView personPage() {
return new ModelAndView("person-page", "person-entity", new Person());
}
@RequestMapping(value="/process-person")
public ModelAndView processPerson(@ModelAttribute Person person) {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("person-result-page");
modelAndView.addObject("pers", person);
modelAndView.addObject("personObj", person);
return modelAndView;
}
}
नीचे दिया गया एनोटेट कोड "मान" को "नाम" पर सेट करेगा
@RequestMapping("/testing")
@Controller
public class TestController {
@RequestMapping(method = RequestMethod.GET)
public String testMestod(HttpServletRequest request){
request.getSession().setAttribute("name", "value");
return "testJsp";
}
}
JSP के उपयोग में समान का उपयोग करने के लिए
${sessionScope.name}
।
क्या यह सबसे आसान और छोटा रास्ता नहीं है? मैं इसे जानता था और अभी-अभी इसका परीक्षण किया है -
@GetMapping
public String hello(HttpSession session) {
session.setAttribute("name","value");
return "hello";
}
ps मैं यहां " स्प्रिंग-एमवीसी में सत्र विशेषताओं का उपयोग कैसे करें " के उत्तर की खोज के लिए आया था , लेकिन मैंने अपने कोड में जो सबसे स्पष्ट लिखा था, उसे देखे बिना इतने सारे पढ़े। मैंने इसे नहीं देखा, इसलिए मैंने सोचा कि यह गलत है, लेकिन नहीं यह नहीं था। तो मुख्य प्रश्न के सबसे आसान समाधान के साथ उस ज्ञान को साझा करने दें।
इसे इस्तेमाल करे...
@Controller
@RequestMapping("/owners/{ownerId}/pets/{petId}/edit")
@SessionAttributes("pet")
public class EditPetForm {
@ModelAttribute("types")
public Collection<PetType> populatePetTypes() {
return this.clinic.getPetTypes();
}
@RequestMapping(method = RequestMethod.POST)
public String processSubmit(@ModelAttribute("pet") Pet pet,
BindingResult result, SessionStatus status) {
new PetValidator().validate(pet, result);
if (result.hasErrors()) {
return "petForm";
}else {
this.clinic.storePet(pet);
status.setComplete();
return "redirect:owner.do?ownerId="
+ pet.getOwner().getId();
}
}
}
जब मैं अपने लॉगिन (जो बूटस्ट्रैप मोडल है) की कोशिश कर रहा हूं, तो मैंने @sessionattributes एनोटेशन का उपयोग किया। लेकिन समस्या तब थी जब दृश्य एक पुनर्निर्देशित ("पुनर्निर्देशित: / घर") है, मान जो मैंने सत्र में url में दिखाया था। कुछ इंटरनेट स्रोत http://docs.spring.io/spring/docs/4.3.x/spring-framework-reference/htmlsingle/#mvc-redirecting का अनुसरण करने का सुझाव देते हैं लेकिन मैंने इसके बजाय Http://ession का उपयोग किया। यह सत्र तब तक रहेगा जब तक आप ब्राउज़र बंद नहीं कर देते। यहाँ नमूना कोड है
@RequestMapping(value = "/login")
@ResponseBody
public BooleanResponse login(HttpSession session,HttpServletRequest request){
//HttpServletRequest used to take data to the controller
String username = request.getParameter("username");
String password = request.getParameter("password");
//Here you set your values to the session
session.setAttribute("username", username);
session.setAttribute("email", email);
//your code goes here
}
आप दृश्य पक्ष पर विशिष्ट चीज़ नहीं बदलते हैं।
<c:out value="${username}"></c:out>
<c:out value="${email}"></c:out>
लॉगिन करने के बाद आप वेब साइट के किसी भी स्थान पर कोड जोड़ें। यदि सत्र सही ढंग से सेट है, तो आप वहां मान देखेंगे। सुनिश्चित करें कि आपने jstl टैग और El- अभिव्यक्तियों को सही तरीके से जोड़ा है (यहां jstl टैग सेट करने के लिए लिंक है https://menukablog.wordpress.com/2016/05/10/add-jstl-tab-library-to-you-project सही ढंग से / )
इस विधि का उपयोग करने के लिए बहुत सरल आसान है
HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getNativeRequest();
request.getSession().setAttribute("errorMsg", "your massage");
Jsp में एक बार उपयोग करें तो हटा दें
<c:remove var="errorMsg" scope="session"/>
स्प्रिंग 4 वेब एमवीसी में। आप नियंत्रक स्तर के @SessionAttribute
साथ विधि में उपयोग कर सकते हैं@SessionAttributes
@Controller
@SessionAttributes("SessionKey")
public class OrderController extends BaseController {
GetMapping("/showOrder")
public String showPage(@SessionAttribute("SessionKey") SearchCriteria searchCriteria) {
// method body
}