বসন্ত-এমভিসি-তে সেশন বৈশিষ্ট্যগুলি কীভাবে ব্যবহার করবেন


108

আপনি কি আমাকে এই কোডটির বসন্তের এমভিসি স্টাইলের এনালগ লিখতে সহায়তা করতে পারেন?

 session.setAttribute("name","value");

এবং @ModelAttributeসেশনটিতে টীকা দ্বারা টীকাযুক্ত কোনও উপাদান কীভাবে যুক্ত করা যায় এবং তারপরে অ্যাক্সেস পাওয়া যায়?

উত্তর:


185

আপনি যদি প্রতিটি প্রতিক্রিয়ার পরে অবজেক্টটি মুছতে চান তবে আপনার সেশনটির প্রয়োজন হবে না,

আপনি যদি ব্যবহারকারী সেশনের সময় অবজেক্ট রাখতে চান তবে কিছু উপায় রয়েছে:

  1. সেশনে সরাসরি একটি বৈশিষ্ট্য যুক্ত করুন:

    @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");
  2. আপনার নিয়ামক সেশনটি স্কোপযুক্ত করুন

    @Controller
    @Scope("session")
  3. অবজেক্টগুলি স্কোপ করুন, উদাহরণস্বরূপ আপনার ব্যবহারকারীর অবজেক্ট রয়েছে যা প্রতিবারের অধিবেশন করা উচিত:

    @Component
    @Scope("session")
    public class User
     {
        String user;
        /*  setter getter*/
      }

    তারপরে প্রতিটি কন্ট্রোলারে আপনার ইচ্ছা অনুযায়ী ক্লাসটি ইনজেক্ট করুন

       @Autowired
       private User user

    যে অধিবেশন ক্লাস রাখে।

  4. এওপি প্রক্সি ইনজেকশন: বসন্ত-এক্সএমএল:

    <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. পদ্ধতিতে HTTP সেশন পাস করুন:

 String index(HttpSession session) {
            session.setAttribute("mySessionAttribute", "someValue");
            return "index";
        }

@. সেশনটিতে মডেলঅ্যাট্রিবিউট তৈরি করুন @ সেশনঅ্যাট্রিবিউটস ("শপিংকার্ট") দ্বারা:

  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) অগোছালো দৃষ্টিভঙ্গি রাখে, ইউনিট পরীক্ষা করা ভাল নয় not

সেশন জেএসপি অ্যাক্সেস করতে

<%=session.getAttribute("ShoppingCart.prop")%>

জেএসটিএল:

<c:out value="${sessionScope.ShoppingCart.prop}"/>

থাইমালিফে:

<p th:text="${session.ShoppingCart.prop}" th:unless="${session == null}"> . </p>

6
৩. যদি আপনার নিয়ামকটি সিঙ্গেলন হয় তবে আপনার সেশন স্কোপ সহ ইনজেকশন উপাদানটির জন্য প্রক্সিমোড = স্কোপডপ্রক্সি মোড AR টার্গইT_CLASS সংজ্ঞা দেওয়া দরকার। @ স্কোপ (মান = "অধিবেশন", প্রক্সি মোড = স্কোপডপ্রক্সি মোড T TARGET_CLASS)
ভাদিম

1
প্রথমে সাধারণ ব্যবহার করা সহজ এবং সহজ মনে হলেও কন্ট্রোলার সেশনটি স্কোপ করা এখানে সবচেয়ে খারাপ বিকল্প। তবে আপনি যদি ভবিষ্যতে কিছু সময়ের জন্য আপনার অ্যাপ্লিকেশনটি স্কেল করতে চান তবে আপনি সমস্যার মধ্যে পড়ে যাবেন কারণ আপনার সম্ভবত রেডিসের মতো বিতরণকৃত সেশন স্টোরের প্রয়োজন হবে (যদি না আপনি সুবিধার্থে সহজলভ্যতা ত্যাগ না করেন)। সুতরাং, সেশন-স্কোপড মটরশুটিগুলি সাধারণত বোবা সিরিয়ালযোগ্য POJO হওয়া উচিত। প্রয়োজন দেখা দিলে আপনি স্কেল-আউট এর জন্য প্রস্তুত।
খ্রিস্ট

রিকোয়েস্টকন্টেক্সটহোল্ডার সম্পর্কে কী?
ব্যবহারকারীর 1589188

Userশিমের ইনজেকশনটি কেবল তখনই কাজ করবে যদি আপনি sessionবিনকে userকোনও ক্লাসে ডাকে থকেও বাদ দেওয়া হয়, অন্যথায় যদি কোনও সেশন উপস্থিত না থাকে তবে এটি ব্যতিক্রম ছুঁড়ে দেয় কারণ আমরা যখন বিনকে অন্য একটি ইনজেকশনে ইনজেকশন দেই তখন @ রনটাইম প্রসঙ্গে কোনও সক্রিয় অধিবেশন থাকবে না। !!
জোসেহ্লাংগা

41

ব্যবহার @SessionAttributes

দস্তাবেজগুলি দেখুন: অনুরোধের মধ্যে এইচটিটিপি সেশনে মডেল বৈশিষ্ট্যগুলি সংরক্ষণ করতে @ সেশনঅ্যাট্রিবিউটস ব্যবহার করে

" স্প্রিং এমভিসি মডেল এবং সেশন অ্যাট্রিবিউটগুলি বোঝা " এছাড়াও স্প্রিং এমভিসি সেশনগুলির একটি খুব ভাল ওভারভিউ দেয় এবং ব্যাখ্যা করে যে কীভাবে / কখন @ModelAttributeসেশনে স্থানান্তরিত হয় (যদি নিয়ামকটি @SessionAttributesটিকা দেওয়া হয়)।

এই নিবন্ধটি আরও ব্যাখ্যা করে যে @SessionAttributesসরাসরি এইচটিটিপসেশনটিতে অ্যাট্রিবিউট সেট করার পরিবর্তে মডেলটি ব্যবহার করা আরও ভাল কারণ এটি স্প্রিং এমভিসি-কে অজগনস্টিক হতে সহায়তা করে।


আপনি কীভাবে সেশনটি উত্তোলন করতে পারবেন কন্ট্রোলারদের মধ্যে অবজেক্টগুলি স্থানান্তর করতে?
ল্যারিটেক

27

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;
    }

}

সেশনগুলি একই নিয়ামক উদাহরণের মধ্যে কেবল অনুরোধের জন্য কাজ করে। নিয়ন্ত্রণ যদি অন্য নিয়ামকের কাছে প্রেরণের প্রয়োজন হয় তবে এই সেশনটি ধ্বংস হয়ে যাবে এবং প্রয়োজনে একটি নতুন তৈরি করা হবে।
লরিটেক

1
@ এলারিটেক কিভাবে এটি হতে পারে? আমি মনে করি আপনি নিজের দ্বিতীয় নিয়ামক হিসাবে সেশনঅ্যাট্রিবিউটগুলি যুক্ত করতে ভুলে গেছেন
ইউরা

19

নীচে বর্ণিত কোডটি "মান" "নাম" হিসাবে সেট করবে

@RequestMapping("/testing")
@Controller
public class TestController {
@RequestMapping(method = RequestMethod.GET)
public String testMestod(HttpServletRequest request){
    request.getSession().setAttribute("name", "value");
    return "testJsp";
  }
}

জেএসপি ব্যবহারে একই অ্যাক্সেস করতে ${sessionScope.name}

জন্য @ModelAttributeএই দেখতে লিংক


4

এটি কি সবচেয়ে সহজ এবং সংক্ষিপ্ততম নয় ? আমি এটি জানতাম এবং কেবল এটি পরীক্ষা করেছি - এখানে নিখুঁতভাবে কাজ করা:

@GetMapping
public String hello(HttpSession session) {
    session.setAttribute("name","value");
    return "hello";
}

PS আমি এখানে " স্প্রিং-এমভিসি তে সেশন বৈশিষ্ট্যগুলি কীভাবে ব্যবহার করতে পারি " এর উত্তর অনুসন্ধান করতে এসেছি, তবে আমি আমার কোডটিতে লিখেছি এমনটি সবচেয়ে স্পষ্ট না দেখে অনেকগুলি পড়ি read আমি এটি দেখতে পেলাম না, তাই আমি এটির ভুল বলে মনে করেছি, তবে এটি এটি ছিল না। সুতরাং সেই প্রশ্নের জ্ঞানটি মূল প্রশ্নের সহজ সমাধানের সাথে ভাগ করে নেওয়া যাক।


1
তুমি ঠিক বলছো ! আপনি যখনই কন্ট্রোলার পদ্ধতিতে ঘোষণা করেন তখন আমাদের সরাসরি প্রয়োজন এমন সমস্ত এইচটিটিপি অবজেক্টকে অ্যাক্সেস করতে পারেন বলে আমি ভাবছিলাম
শেসুকি

1

এটা চেষ্টা কর...

@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();
        }
    }
}

0

আমি যখন আমার লগইনটিতে (যা একটি বুটস্ট্র্যাপ মডেল) চেষ্টা করার চেষ্টা করছিলাম, তখন আমি @ অ্যাসিশনঅ্যাট্রিবিউট টীকাটি ব্যবহার করেছি। তবে সমস্যাটি তখন ছিল যখন ভিউটি পুনঃনির্দেশিত ("পুনর্নির্দেশ: / হোম"), ইউআরএলের সেশন শোতে আমি প্রবেশ করা মানগুলি। কিছু ইন্টারনেট উত্স http://docs.spring.io/spring/docs/4.3.x/spring-framework-references/htmlsingle/#mvc-redirecting অনুসরণ করার পরামর্শ দেয় তবে আমি পরিবর্তে এইচটিটিপিএসশন ব্যবহার করেছি। আপনি ব্রাউজারগুলি বন্ধ না করা পর্যন্ত এই অধিবেশনটি উপস্থিত থাকবে। এখানে নমুনা কোড

        @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 ট্যাগ সেট করার লিঙ্কটি https://menukablog.wordpress.com/2016/05/10/add-jstl-tab-library-to-you-pro- সঠিকভাবে / )


0

এই পদ্ধতিটি ব্যবহার করুন খুব সহজেই ব্যবহার করা সহজ

HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getNativeRequest();

                                                            request.getSession().setAttribute("errorMsg", "your massage");

jsp এ একবার ব্যবহার করুন তারপর অপসারণ

<c:remove var="errorMsg" scope="session"/>      

0

স্প্রিং 4 ওয়েব এমভিসি। আপনি নিয়ামক স্তরের @SessionAttributeসাথে পদ্ধতিতে ব্যবহার করতে পারেন@SessionAttributes

@Controller
@SessionAttributes("SessionKey")
public class OrderController extends BaseController {

    GetMapping("/showOrder")
    public String showPage(@SessionAttribute("SessionKey") SearchCriteria searchCriteria) {
     // method body
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.