Bạn có thể giúp tôi viết tương tự phong cách mùa xuân mvc của mã này?
session.setAttribute("name","value");
Và làm thế nào để thêm một phần tử được chú thích bởi @ModelAttribute
chú thích vào phiên và sau đó có quyền truy cập vào nó?
Bạn có thể giúp tôi viết tương tự phong cách mùa xuân mvc của mã này?
session.setAttribute("name","value");
Và làm thế nào để thêm một phần tử được chú thích bởi @ModelAttribute
chú thích vào phiên và sau đó có quyền truy cập vào nó?
Câu trả lời:
Nếu bạn muốn xóa đối tượng sau mỗi phản hồi mà bạn không cần phiên,
Nếu bạn muốn giữ đối tượng trong phiên người dùng, có một số cách:
thêm trực tiếp một thuộc tính vào phiên:
@RequestMapping(method = RequestMethod.GET)
public String testMestod(HttpServletRequest request){
ShoppingCart cart = (ShoppingCart)request.getSession().setAttribute("cart",value);
return "testJsp";
}
và bạn có thể lấy nó từ bộ điều khiển như sau:
ShoppingCart cart = (ShoppingCart)session.getAttribute("cart");
Làm cho phiên điều khiển của bạn có phạm vi
@Controller
@Scope("session")
Phạm vi đối tượng, ví dụ: bạn có đối tượng người dùng phải có trong phiên mọi lúc:
@Component
@Scope("session")
public class User
{
String user;
/* setter getter*/
}
sau đó đưa lớp vào từng bộ điều khiển mà bạn muốn
@Autowired
private User user
để giữ cho lớp học đúng phiên.
Chèn proxy AOP: trong spring -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>
sau đó đưa lớp vào từng bộ điều khiển mà bạn muốn
@Autowired
private User user
5.Pass HttpSession đến phương thức:
String index(HttpSession session) {
session.setAttribute("mySessionAttribute", "someValue");
return "index";
}
6. Tạo ModelAttribute trong phiên bởi @SessionAttributes ("ShoppingCart"):
public String index (@ModelAttribute("ShoppingCart") ShoppingCart shoppingCart, SessionStatus sessionStatus) {
//Spring V4
//you can modify session status by sessionStatus.setComplete();
}
hoặc bạn có thể thêm Model vào toàn bộ Lớp điều khiển như,
@Controller
@SessionAttributes("ShoppingCart")
@RequestMapping("/req")
public class MYController {
@ModelAttribute("ShoppingCart")
public Visitor getShopCart (....) {
return new ShoppingCart(....); //get From DB Or Session
}
}
mỗi cái đều có ưu điểm và nhược điểm:
@session có thể sử dụng nhiều bộ nhớ hơn trong các hệ thống đám mây, nó sao chép phiên tới tất cả các nút và phương pháp trực tiếp (1 và 5) có cách tiếp cận lộn xộn, không tốt cho kiểm thử đơn vị.
Để truy cập jsp phiên
<%=session.getAttribute("ShoppingCart.prop")%>
trong Jstl:
<c:out value="${sessionScope.ShoppingCart.prop}"/>
trong Thymeleaf:
<p th:text="${session.ShoppingCart.prop}" th:unless="${session == null}"> . </p>
User
bean sẽ chỉ hoạt động nếu bạn đang gọi bean trong một lớp cũng được session
xác định phạm vi, ngược lại nếu không có phiên nào tồn tại thì nó sẽ ném ra ngoại lệ vì sẽ không có bất kỳ phiên hoạt động nào trong ngữ cảnh @runtime khi chúng ta tiêm user
bean vào một lớp khác !!
Sử dụng @SessionAttributes
Xem tài liệu: Sử dụng @SessionAttributes để lưu trữ các thuộc tính mô hình trong phiên HTTP giữa các yêu cầu
" Hiểu mô hình Spring MVC và các thuộc tính phiên " cũng cung cấp một cái nhìn tổng quan rất tốt về các phiên Spring MVC và giải thích cách / khi nào @ModelAttribute
các s được chuyển vào phiên (nếu bộ điều khiển được @SessionAttributes
chú thích).
Bài báo đó cũng giải thích rằng tốt hơn nên sử dụng @SessionAttributes
trên mô hình thay vì đặt các thuộc tính trực tiếp trên HttpSession vì điều đó giúp Spring MVC trở nên bất khả tri về chế độ xem.
SessionAttribute
chú thích là cách đơn giản nhất và chuyển tiếp thay vì nhận phiên từ đối tượng yêu cầu và thuộc tính cài đặt.
Bất kỳ đối tượng nào cũng có thể được thêm vào mô hình trong bộ điều khiển và nó sẽ được lưu trữ trong phiên nếu tên của nó khớp với đối số trong @SessionAttributes
chú thích.
Trong ví dụ dưới đây, personObj
sẽ có sẵn trong phiên.
@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;
}
}
Mã chú thích bên dưới sẽ đặt "giá trị" thành "tên"
@RequestMapping("/testing")
@Controller
public class TestController {
@RequestMapping(method = RequestMethod.GET)
public String testMestod(HttpServletRequest request){
request.getSession().setAttribute("name", "value");
return "testJsp";
}
}
Để truy cập giống nhau trong sử dụng JSP
${sessionScope.name}
.
Để @ModelAttribute
xem liên kết này
Đó không phải là cách dễ nhất và ngắn nhất sao? Tôi biết điều đó và chỉ thử nghiệm nó - hoạt động hoàn hảo ở đây:
@GetMapping
public String hello(HttpSession session) {
session.setAttribute("name","value");
return "hello";
}
ps Tôi đến đây để tìm kiếm câu trả lời về " Cách sử dụng thuộc tính Session trong Spring-mvc ", nhưng đọc quá nhiều mà không thấy rõ ràng nhất mà tôi đã viết trong mã của mình. Tôi không nhìn thấy nó, vì vậy tôi nghĩ nó sai, nhưng không, không phải vậy. Vì vậy, hãy chia sẻ kiến thức đó với giải pháp dễ nhất cho câu hỏi chính.
Thử cái này...
@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();
}
}
}
Khi tôi cố gắng đăng nhập (là một phương thức bootstrap), tôi đã sử dụng chú thích @sessionattributes. Nhưng vấn đề là khi chế độ xem là một chuyển hướng ("redirect: / home"), các giá trị tôi đã nhập vào phiên hiển thị trong url. Một số nguồn Internet khuyên bạn nên làm theo http://docs.spring.io/spring/docs/4.3.x/spring-framework-reference/htmlsingle/#mvc-redirecting Nhưng thay vào đó tôi đã sử dụng HttpSession. Phiên này sẽ ở đó cho đến khi bạn đóng trình duyệt. Đây là mã mẫu
@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
}
Bạn không thay đổi điều cụ thể về mặt xem.
<c:out value="${username}"></c:out>
<c:out value="${email}"></c:out>
Sau khi đăng nhập, hãy thêm các mã trên vào bất kỳ nơi nào trong trang web của bạn. Nếu phiên được đặt chính xác, bạn sẽ thấy các giá trị ở đó. Đảm bảo bạn đã thêm chính xác thẻ jstl và biểu thức El- (Đây là liên kết để đặt thẻ jstl https://menukablog.wordpress.com/2016/05/10/add-jstl-tab-library-to-you-project- chính xác / )
Sử dụng Phương pháp này rất đơn giản dễ sử dụng
HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getNativeRequest();
request.getSession().setAttribute("errorMsg", "your massage");
trong jsp một lần sử dụng sau đó loại bỏ
<c:remove var="errorMsg" scope="session"/>
Trong Spring 4 Web MVC. Bạn có thể sử dụng @SessionAttribute
trong phương pháp với @SessionAttributes
ở cấp Bộ điều khiển
@Controller
@SessionAttributes("SessionKey")
public class OrderController extends BaseController {
GetMapping("/showOrder")
public String showPage(@SessionAttribute("SessionKey") SearchCriteria searchCriteria) {
// method body
}