Você poderia me ajudar a escrever um análogo ao estilo Spring MVC deste código?
session.setAttribute("name","value");
E como adicionar um elemento que é anotado por @ModelAttribute
anotação à sessão e, em seguida, obter acesso a ele?
fonte
Você poderia me ajudar a escrever um análogo ao estilo Spring MVC deste código?
session.setAttribute("name","value");
E como adicionar um elemento que é anotado por @ModelAttribute
anotação à sessão e, em seguida, obter acesso a ele?
Se você deseja excluir o objeto após cada resposta, você não precisa da sessão,
Se você deseja manter o objeto durante a sessão do usuário, existem algumas maneiras:
adicione diretamente um atributo à sessão:
@RequestMapping(method = RequestMethod.GET)
public String testMestod(HttpServletRequest request){
ShoppingCart cart = (ShoppingCart)request.getSession().setAttribute("cart",value);
return "testJsp";
}
e você pode obtê-lo do controlador assim:
ShoppingCart cart = (ShoppingCart)session.getAttribute("cart");
Faça sua sessão de controlador com escopo
@Controller
@Scope("session")
Defina o escopo dos objetos, por exemplo, você tem um objeto de usuário que deve estar sempre em sessão:
@Component
@Scope("session")
public class User
{
String user;
/* setter getter*/
}
em seguida, injete classe em cada controlador que você deseja
@Autowired
private User user
que mantém a aula na sessão.
A injeção de proxy AOP: em 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>
em seguida, injete classe em cada controlador que você deseja
@Autowired
private User user
5. Passe HttpSession para o método:
String index(HttpSession session) {
session.setAttribute("mySessionAttribute", "someValue");
return "index";
}
6. Faça ModelAttribute na sessão por @SessionAttributes ("ShoppingCart"):
public String index (@ModelAttribute("ShoppingCart") ShoppingCart shoppingCart, SessionStatus sessionStatus) {
//Spring V4
//you can modify session status by sessionStatus.setComplete();
}
ou você pode adicionar o modelo a toda classe de controlador como,
@Controller
@SessionAttributes("ShoppingCart")
@RequestMapping("/req")
public class MYController {
@ModelAttribute("ShoppingCart")
public Visitor getShopCart (....) {
return new ShoppingCart(....); //get From DB Or Session
}
}
cada um tem vantagem e desvantagem:
@session pode usar mais memória em sistemas em nuvem, pois copia a sessão para todos os nós, e o método direto (1 e 5) tem uma abordagem confusa, não é bom para teste de unidade.
Para acessar a sessão jsp
<%=session.getAttribute("ShoppingCart.prop")%>
em Jstl:
<c:out value="${sessionScope.ShoppingCart.prop}"/>
em Thymeleaf:
<p th:text="${session.ShoppingCart.prop}" th:unless="${session == null}"> . </p>
User
bean só funcionará se você estiver chamando o bean em uma classe que também temsession
escopo, caso contrário, se não houver sessão, ele lançará uma exceção, pois não haveria nenhuma sessão ativa no contexto @runtime quando injetamos ouser
bean em outra classe !!Usar
@SessionAttributes
Veja os documentos: Usando @SessionAttributes para armazenar atributos de modelo na sessão HTTP entre solicitações
" Understanding Spring MVC Model and Session Attributes " também oferece uma visão geral muito boa das sessões do Spring MVC e explica como / quando
@ModelAttribute
s são transferidos para a sessão (se o controlador estiver@SessionAttributes
anotado).Esse artigo também explica que é melhor usar
@SessionAttributes
no modelo em vez de definir atributos diretamente na HttpSession, porque isso ajuda o Spring MVC a ser agnóstico de visualização.fonte
SessionAttribute
a anotação é a mais simples e direta em vez de obter a sessão do objeto de solicitação e do atributo de configuração. Qualquer objeto pode ser adicionado ao modelo no controlador e será armazenado na sessão se seu nome corresponder ao argumento na@SessionAttributes
anotação. Abaixo, por exemplo,personObj
estará disponível na sessão.fonte
O código anotado abaixo definiria "valor" para "nome"
Para acessar o mesmo em uso JSP
${sessionScope.name}
.Para
@ModelAttribute
ver este linkfonte
Não é mais fácil e mais curto assim? Eu sabia e apenas testei - funcionando perfeitamente aqui:
ps Eu vim aqui procurando por uma resposta de " Como usar atributos de sessão no Spring-mvc ", mas li tantos sem ver o mais óbvio que eu havia escrito em meu código. Eu não vi, então pensei que era errado, mas não estava. Então, vamos compartilhar esse conhecimento com a solução mais fácil para a questão principal.
fonte
Experimente isso ...
fonte
Quando tento meu login (que é um modal de bootstrap), usei a anotação @sessionattributes. Mas o problema foi quando a view é um redirecionamento ("redirect: / home"), os valores que eu inseri na sessão mostram na url. Algumas fontes da Internet sugerem seguir http://docs.spring.io/spring/docs/4.3.x/spring-framework-reference/htmlsingle/#mvc-redirecting Mas, em vez disso, usei HttpSession. Esta sessão estará lá até você fechar os navegadores. Aqui está um exemplo de código
Você não muda nada específico no lado da vista.
Após o login, adicione os códigos acima em qualquer lugar do seu site. Se a sessão for configurada corretamente, você verá os valores lá. Certifique-se de adicionar corretamente as tags jstl e as expressões El- (aqui está o link para definir as tags jstl https://menukablog.wordpress.com/2016/05/10/add-jstl-tab-library-to-you-project- corretamente / )
fonte
Use este método muito simples fácil de usar
no jsp uma vez, use e depois remova
fonte
No Spring 4 Web MVC. Você pode usar
@SessionAttribute
no método@SessionAttributes
em nível de controladorfonte