728x90
로그인 유무에 따라 상단탭 다르게 설정하기
ServletAppContext
@Autowired
private TopMenuService topMenuService; //@service
@Resource(name="loginBean")
private User loginBean; //로그인 여부에 따라 상단메뉴바가 다르게 보이도록 하기 위해 주입받음
//인터셉터 -> 등록
public void addInterceptors(InterceptorRegistry re) {
WebMvcConfigurer.super.addInterceptors(re);
TopMenuInterceptor top=new TopMenuInterceptor(topMenuService, loginBean);
InterceptorRegistration re1=re.addInterceptor(top);//TopMenuInterceptor등록
re1.addPathPatterns("/**"); //모든경로로 매핑해도 다 뜨도록..컨트롤러 전에 preHandle
}
위와 같이 코드 추가
아래는 전체코
package kr.bit.config;
import kr.bit.beans.User;
import kr.bit.interceptor.TopMenuInterceptor;
import kr.bit.mapper.BoardMapper;
import kr.bit.mapper.TopMenuMapper;
import kr.bit.mapper.UserMapper;
import kr.bit.service.TopMenuService;
import org.apache.commons.dbcp2.BasicDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperFactoryBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.*;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.web.servlet.config.annotation.*;
@Configuration
@EnableWebMvc
@ComponentScan("kr.bit.controller")
@ComponentScan("kr.bit.dao")
@ComponentScan("kr.bit.service")
@PropertySource("/WEB-INF/properties/db.properties")
public class ServletAppContext implements WebMvcConfigurer {
@Value("${db.classname}")
private String db_classname;
@Value("${db.url}")
private String db_url;
@Value("${db.username}")
private String db_username;
@Value("${db.password}")
private String db_password;
@Autowired
private TopMenuService topMenuService; //@service
@Resource(name="loginBean")
private User loginBean; //로그인 여부에 따라 상단메뉴바가 다르게 보이도록 하기 위해 주입받음
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
WebMvcConfigurer.super.configureViewResolvers(registry);
registry.jsp("/WEB-INF/views/", ".jsp");
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
WebMvcConfigurer.super.addResourceHandlers(registry);
registry.addResourceHandler("/**").addResourceLocations("/resources/");
}
@Bean
public BasicDataSource dataSource() {
BasicDataSource source= new BasicDataSource();
source.setDriverClassName(db_classname);
source.setUrl(db_url);
source.setUsername(db_username);
source.setPassword(db_password);
return source;
}
@Bean
public SqlSessionFactory factory(BasicDataSource source) throws Exception{
SqlSessionFactoryBean fac=new SqlSessionFactoryBean();
fac.setDataSource(source);
SqlSessionFactory factory=fac.getObject();
return factory;
}
@Bean
public MapperFactoryBean<BoardMapper> board_mapper(SqlSessionFactory factory) throws Exception{
MapperFactoryBean<BoardMapper> fac =
new MapperFactoryBean<BoardMapper>(BoardMapper.class);
fac.setSqlSessionFactory(factory);
return fac;
}
@Bean
public MapperFactoryBean<TopMenuMapper> top_mapper(SqlSessionFactory factory) throws Exception{
MapperFactoryBean<TopMenuMapper> fac =
new MapperFactoryBean<TopMenuMapper>(TopMenuMapper.class);
fac.setSqlSessionFactory(factory);
return fac;
}
@Bean
public MapperFactoryBean<UserMapper> user_mapper(SqlSessionFactory factory) throws Exception{
MapperFactoryBean<UserMapper> fac =
new MapperFactoryBean<UserMapper>(UserMapper.class);
fac.setSqlSessionFactory(factory);
return fac;
}
//인터셉터 -> 등록
public void addInterceptors(InterceptorRegistry re) {
WebMvcConfigurer.super.addInterceptors(re);
TopMenuInterceptor top=new TopMenuInterceptor(topMenuService, loginBean);
InterceptorRegistration re1=re.addInterceptor(top);//TopMenuInterceptor등록
re1.addPathPatterns("/**"); //모든경로로 매핑해도 다 뜨도록..컨트롤러 전에 preHandle
}
@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
@Bean
public ReloadableResourceBundleMessageSource messageSource() {
ReloadableResourceBundleMessageSource res=
new ReloadableResourceBundleMessageSource();
res.setBasename("/WEB-INF/properties/error");
return res;
}
}
TopMenuInterceptor
loginBean과 관련된 부분 주석처리해제 및 추가
package kr.bit.interceptor;
import kr.bit.beans.BoardInfo;
import kr.bit.beans.User;
import kr.bit.service.TopMenuService;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
public class TopMenuInterceptor implements HandlerInterceptor {
private TopMenuService topMenuService;
@Resource(name = "loginBean") //
private User loginBean; // 주석처리 해제
public TopMenuInterceptor(TopMenuService topMenuService) {
this.topMenuService = topMenuService;
this.loginBean = loginBean; //추가
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
List<BoardInfo> team = topMenuService.getTopMenuList(); //select .. 1,2,1팀,2팀
request.setAttribute("team", team);
request.setAttribute("loginBean",loginBean); // 추가
return true;
}
}
top_menu.jsp
절대값주소 변경 및 c:chosse, c:when 추가
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="root" value="${pageContext.request.contextPath }/"/>
<nav class="navbar navbar-expand-md bg-dark text-white fixed-up shadow-lg">
<a class=navbar-brand" href="${root }main">Board Project</a>
<div class="container-fluid">
<button class="navbar-toggler" type="button" data-toggle="collapse"
data-target="#navbarNav">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav">
<c:forEach var="obj" items="${team }">
<li class="nav-item">
<a href="${root }board/main?board_info_idx=${obj.board_info_idx}"
class="nav-link">${obj.board_info_name}</a>
</li>
</c:forEach>
</ul>
<ul class="navbar-nav ml-auto">
<c:choose>
<c:when test="${loginBean.userLogin==true}">
<li class="nav-item">
<a class="nav-link" href="${root }user/modify">Modify</a>
</li>
<li class="nav-item">
<a class="nav-link" href="${root }user/logout">Log Out</a>
</li>
</c:when>
<c:otherwise>
<li class="nav-item">
<a class="nav-link" href="${root }user/login">Log In</a>
</li>
<li class="nav-item">
<a class="nav-link" href="${root }user/join">Join Us</a>
</li>
</c:otherwise>
</c:choose>
</ul>
</div>
</div>
</nav>

UserContrlloer
코드 추가
@GetMapping("/logout")
public String logout() {
loginBean.setUserLogin(false);
return "user/logout";
}
logout.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<c:set var="root" value="${pageContext.request.contextPath }/" />
<script>
alert("LogOut!");
location.href="${root }main";
</script>

LoginInterceptor
package kr.bit.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import kr.bit.beans.User;
public class LoginInterceptor implements HandlerInterceptor{
private User loginBean;
public LoginInterceptor(User loginBean) {
this.loginBean=loginBean;
}
//로그인 안되어있으면 주소를 입력해도 못들어가도록 막아죠~~
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
if(loginBean.isUserLogin()==false) {
String str=request.getContextPath();
response.sendRedirect(str+"/user/not_login");
return false;
}
return true;
}
}
ServletAppContext
인터셉트 추가
public void addInterceptors(InterceptorRegistry re) {
WebMvcConfigurer.super.addInterceptors(re);
TopMenuInterceptor top = new TopMenuInterceptor(topMenuService, loginBean);
InterceptorRegistration re1 = re.addInterceptor(top);//TopMenuInterceptor등록
re1.addPathPatterns("/**"); //모든경로로 매핑해도 다 뜨도록..컨트롤러 전에 preHandle
LoginInterceptor login = new LoginInterceptor(loginBean);
InterceptorRegistration re2= re.addInterceptor(login);
re2.addPathPatterns("/user/modify", "user/logout","/board/*");
re2.excludePathPatterns("/board/main");
}
not_login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<c:set var="root" value="${pageContext.request.contextPath }/" />
<script>
alert('You have to Login')
location.href="${root}user/login"
</script>

정보수정
modify.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<c:set var="root" value="${pageContext.request.contextPath }/" />
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>우리반 화이팅</title>
<!-- Bootstrap CDN -->
<link rel="stylesheet"
href="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css">
<script
src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script
src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js"></script>
<script
src="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js"></script>
<body>
<c:import url="/WEB-INF/views/include/top_menu.jsp" />
<div class="container" style="margin-top: 100px">
<div class="row">
<div class="col-sm-3"></div>
<div class="col-sm-6">
<div class="card shadow">
<div class="card-body">
<form:form action="${root}user/modify_pro" method="post" modelAttribute="modifyBean">
<form:hidden path="existId"/>
<div class="form-group">
<form:label path="user_name">이름</form:label>
<form:input type="text" path="user_name" class="form-control" readonly="true"/>
<form:errors path="user_name" style='color:red'/>
</div>
<div class="form-group">
<form:label path="user_id">아이디</form:label>
<div class="input-group">
<form:input class="form-control" path="user_id" readonly="true"/>
</div>
</div>
<div class="form-group">
<form:label path="user_pw">비밀번호</form:label>
<form:password path="user_pw" class="form-control"/>
<form:errors path="user_pw" style='color:red'/>
</div>
<div class="form-group">
<form:label path="user_pw2">비밀번호 확인</form:label>
<form:password path="user_pw2" class="form-control"/>
<form:errors path="user_pw2" style='color:red'/>
</div>
<div class="form-group">
<div class="text-right">
<button type="submit" class="btn btn-primary">정보수정</button>
</div>
</div>
</form:form>
</div>
</div>
</div>
</div>
<c:import url="/WEB-INF/views/include/bottom_menu.jsp" />
</body>
</html>
UserController
아래 코드 추가
@GetMapping("/modify")
public String modify(@ModelAttribute("modifyBean") User modifyBean) {
return "user/modify";
}
@PostMapping("/modify_pro")
public String modify_pro(@ModelAttribute("modifyBean") User modifyBean,
BindingResult result) {
if (result.hasErrors()) {
return "user/modify";
}
return "user/modify_success";
}
전체코드
package kr.bit.controller;
import javax.annotation.Resource;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import kr.bit.beans.User;
import kr.bit.service.UserService;
import kr.bit.validator.UserValidator;
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService; //컨트롤러 전후 단계 - 비즈니스로직 (service)
@Resource(name="loginBean")
private User loginBean; // 로그인 여부확인으로 세션영역에 담아 놓은거 자동주입받음
@GetMapping("/modify")
public String modify(@ModelAttribute("modifyBean") User modifyBean) {
return "user/modify";
}
@PostMapping("/modify_pro")
public String modify_pro(@ModelAttribute("modifyBean") User modifyBean,
BindingResult result) {
if (result.hasErrors()) {
return "user/modify";
}
return "user/modify_success";
}
@GetMapping("/modify")
public String modify() {
return "user/modify";
}
@GetMapping("/logout")
public String logout() {
loginBean.setUserLogin(false); //로그인 되어있는 상태 아님
return "user/logout";
}
@GetMapping("/login")
public String login(@ModelAttribute("loginProBean") User loginProBean, @RequestParam(value="fail", defaultValue = "false") boolean fail, Model model) {
model.addAttribute("fail", fail);
return "user/login";
}
@PostMapping("/login_pro")
public String login(@Valid @ModelAttribute("loginProBean") User loginProBean, BindingResult result) {
if(result.hasErrors()) {
return "user/login";
}
userService.getLoginUser(loginProBean); // 로그인 성공하면 user_idx, user_name 추출
if(loginBean.isUserLogin()==true) {
return "user/login_success";
}
else {
return "user/login_fail";
}
}
@GetMapping("/join")
public String join(@ModelAttribute("joinBean") User joinBean) { //상단메뉴 - 회원가입
return "user/join";
}
@PostMapping("/join_pro") //join
public String join_pro(@Valid @ModelAttribute("joinBean") User joinBean,
BindingResult result) {
if(result.hasErrors()) {
return "user/join";
} //에러있음 원래 회원가입 폼
userService.addUser(joinBean); //db에 삽입 (insert)
return "user/join_success";
}
@GetMapping("/not_login")
public String not_login() {
return "user/not_login";
}
@InitBinder
public void initBinder(WebDataBinder binder) {
UserValidator v1=new UserValidator();
binder.addValidators(v1);
}
}
UserMapper
modify 추가
package kr.bit.mapper;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import kr.bit.beans.User;
import org.apache.ibatis.annotations.Update;
public interface UserMapper {
@Select("select user_name from user_table where user_id=#{user_id}")
String existId(String user_id);
@Insert("insert into user_table(user_name, user_id, user_pw) values(#{user_name}, #{user_id}, #{user_pw})")
void addUser(User joinBean);
//아이디랑 비번 검사해서 user_idx, user_name추출
@Select("select user_idx, user_name from user_table where user_id=#{user_id} and user_pw=#{user_pw}")
User getLoginUser(User loginProBean);
@Select("select user_id, user_name from user_table where user_idx=#{user_idx}")
User getModifyUser(int user_idx);
@Update("update user_table set user_pw=#{user_pw} where user_idx=#{user_idx}")
void modifyUser(User modifyBean);
}
UserDao
modify코드 추가
package kr.bit.dao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import kr.bit.beans.User;
import kr.bit.mapper.UserMapper;
@Repository
public class UserDao {
@Autowired
private UserMapper userMapper;
public String existId(String user_id) {
return userMapper.existId(user_id);
}
public void addUser(User joinBean) {
userMapper.addUser(joinBean);
}
public User getLoginUser(User loginProBean) {
return userMapper.getLoginUser(loginProBean);
}
public User getModifyUser(int user_idx) {
return userMapper.getModifyUser(user_idx);
}
public void modifyUser(User modifyBean) {
userMapper.modifyUser(modifyBean);
}
}
UserService
package kr.bit.service;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import kr.bit.beans.User;
import kr.bit.dao.UserDao;
@Service
public class UserService {
@Autowired
private UserDao userDao;
@Resource(name="loginBean") //RootAppContext 세션영역에 설정한 빈 이름과 같기 때문에 주소값 자동주입
private User loginBean;
public boolean existId(String user_id) {
String user_name=userDao.existId(user_id);
if(user_name==null) {
return true; // 사용할 수 있는 아이디면
}
return false;
}
public void addUser(User joinBean) {
userDao.addUser(joinBean);
}
public void getLoginUser(User loginProBean) {
User loginProBean2 = userDao.getLoginUser(loginProBean);
if(loginProBean2 != null) {
loginBean.setUser_idx(loginProBean2.getUser_idx());
//로그인 되어있는 사람의 idx값 가져와서 User의 클래스 필드(user_id)에 세팅
loginBean.setUser_name(loginProBean2.getUser_name());
loginBean.setUserLogin(true); //로그인이 되어있는 상태이므로 true
// 비번, 아이디가 일치하면 -> 로그인이 된 상태라면
// 세션영역에 담은 loginBean객체로부터 idx, name, 로그인 여부확인을 설정할거임
}
}
public void getModifyUser(User modifyBean) {
User user = userDao.getModifyUser(loginBean.getUser_idx()); //로그인한 사람의 idx 기준으로 name, id 추출
modifyBean.setUser_id(user.getUser_id());
modifyBean.setUser_name(user.getUser_name());
modifyBean.setUser_idx(user.getUser_idx());
}
public void modifyUser(User modifyBean) {
modifyBean.setUser_idx(loginBean.getUser_idx());
userDao.modifyUser(modifyBean); // update
}
}
UserController
modify 부분 추가
package kr.bit.controller;
import javax.annotation.Resource;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import kr.bit.beans.User;
import kr.bit.service.UserService;
import kr.bit.validator.UserValidator;
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService; //컨트롤러 전후 단계 - 비즈니스로직 (service)
@Resource(name = "loginBean")
private User loginBean; // 로그인 여부확인으로 세션영역에 담아 놓은거 자동주입받음
@GetMapping("/modify")
public String modify(@ModelAttribute("modifyBean") User modifyBean) {
return "user/modify";
}
@PostMapping("/modify_pro")
public String modify_pro(@ModelAttribute("modifyBean") User modifyBean,
BindingResult result) {
if (result.hasErrors()) {
return "user/modify";
}
userService.modifyUser(modifyBean);
return "user/modify_success";
}
@GetMapping("/modify")
public String modify() {
return "user/modify";
}
@GetMapping("/logout")
public String logout() {
loginBean.setUserLogin(false); //로그인 되어있는 상태 아님
return "user/logout";
}
@GetMapping("/login")
public String login(@ModelAttribute("loginProBean") User loginProBean, @RequestParam(value = "fail", defaultValue = "false") boolean fail, Model model) {
model.addAttribute("fail", fail);
return "user/login";
}
@PostMapping("/login_pro")
public String login(@Valid @ModelAttribute("loginProBean") User loginProBean, BindingResult result) {
if (result.hasErrors()) {
return "user/login";
}
userService.getLoginUser(loginProBean); // 로그인 성공하면 user_idx, user_name 추출
if (loginBean.isUserLogin() == true) {
return "user/login_success";
} else {
return "user/login_fail";
}
}
@GetMapping("/join")
public String join(@ModelAttribute("joinBean") User joinBean) { //상단메뉴 - 회원가입
return "user/join";
}
@PostMapping("/join_pro") //join
public String join_pro(@Valid @ModelAttribute("joinBean") User joinBean,
BindingResult result) {
if (result.hasErrors()) {
return "user/join";
} //에러있음 원래 회원가입 폼
userService.addUser(joinBean); //db에 삽입 (insert)
return "user/join_success";
}
@GetMapping("/not_login")
public String not_login() {
return "user/not_login";
}
@InitBinder
public void initBinder(WebDataBinder binder) {
UserValidator v1 = new UserValidator();
binder.addValidators(v1);
}
}
UserValidator
가입때 뿐만 아니라 정보수정시에도 비밀번호 확인할 수 있도록 추가변경
@Override
public void validate(Object target, Errors errors) {
User user=(User)target;
String beanName=errors.getObjectName();
//join.jsp에서 폼에다 데이터 입력
//-> modelAttribute로 User클래스의 필드에 데이터 값이 저장되어 있는 상태(값 주입한 상태)
if(beanName.equals("joinBean") || beanName.equals("modifyBean")) {
if(user.getUser_pw().equals(user.getUser_pw2())==false) {
errors.rejectValue("user_pw", "NotEqual");
errors.rejectValue("user_pw2", "NotEqual");
}
//비밀번호와 비밀번호확인이 같아야됨.. 유효성검사하는 어노테이션이 따로 없음 -> 개발자가 정의해야함(커스터마이징)
}
db.properties 추가
Size.modifyBean.user_pw=4글자 이상, 10글자 미만으로 작성해주세요
Pattern.modifyBean.user_pw=영문으로만 작성해주세요
Size.modifyBean.user_pw2=4글자 이상, 10글자 미만으로 작성해주세요
Pattern.modifyBean.user_pw2=영문으로만 작성해주세요
NotEqual.modifyBean.user_pw=비밀번호가 일치하지 않습니다
NotEqual.modifyBean.user_pw2=비밀번호가 일치하지 않습니다
modify_success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<c:set var="root" value="${pageContext.request.contextPath }/" />
<script>
alert('수정되었습니다')
location.href="${root}user/modify"
</script>
728x90
'Frameworks > Spring' 카테고리의 다른 글
| [Spring] Board CRUD (Board info, Board Modify) (0) | 2024.05.17 |
|---|---|
| [Spring] Board CRUD (Modify, Update List, Page) (0) | 2024.05.16 |
| [Spring] Board CRUD (Validator + DB insert) III (0) | 2024.05.14 |
| [Spring] Board CRUD (use Bootstrap) II (1) | 2024.05.14 |
| [Spring] Board CRUD (use Bootstrap) (2) | 2024.05.13 |