@Controller
컨트롤러에서 리턴되는 값은 servlet-context.xml
에서 ViewResolver 에서 설정한
prefix와 suffix의 value 값을 합쳐져서 해당 주소로 리턴됨 (밑에 코드로 예시)
RequestMapping
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>
// jsp에서 해당 주소로 이동!
<a class="nav-link" href="${path }/demo/demo.do">ControllerTest</a>
@Controller
public class DemoController {
@RequestMapping("/demo/demo.do") // 해당 주소로 매핑받음
public String demo() {
return "demo/demo"; // /WEB-INF/views/demo/demo.do.jsp 로 이동함
}
✅ 서블릿 방식으로 파라미터값
받기
HttpServletRequest
와 HttpServletResponse
를 사용HttpServletRequest
의 setAttribute
메소드 사용getParmeter
메소드로 받음<button type="button" class="col-sm-12 btn btn-outline-primary"
onclick="requestSend('demo/demo1.do')">
spring 메소드 서블릿처럼 이용하기
</button>
<script>
const requestSend=(url)=>{ // 버튼클릭했을때, 해당 주소로 폼태그 action값 넘기고 전송
$("#devFrm").attr("action","${path}/"+url);
$("#devFrm").submit();
}
</script>
@Controller
public class DemoController {
@RequestMapping("demo/demo1.do")
public void demo1(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException{
String devName = req.getParameter("devName");
int devAge = Integer.parseInt(req.getParameter("devAge"));
String devGender = req.getParameter("devGender");
String devEmail = req.getParameter("devEmail");
String[] devLage = req.getParameterValues("devLang");
Demo d = Demo.builder()
.devName(devName)
.devAge(devAge).devEmail(devEmail)
.devGender(devGender).devLang(devLage).build();
req.setAttribute("demo", d); // 서블릿의 데이터 저장
req.getRequestDispatcher("/WEB-INF/views/demo/demoResult.jsp").forward(req, res);
}
✅ 1:1로 매칭하여 파라미터
값 받기
name
과 동일한 이름의 변수를 선언Model
@RequestMapping("/demo/demo2.do")
public String demo2(String devName,int devAge,String devGender,String devEmail,
String[] devLang, Model model){
// 매개변수중에서 사용하지 않는 String 값은 null값이 들어가서 괜찮지만,
// int나 double 값 처럼 값이 정해져있는것은 꼭 매개변수가 사용되어야한다!! (사용안하면 오류발생)
Demo d = Demo.builder().devName(devName).devAge(devAge).devGender(devGender)
.devEmail(devEmail).devLang(devLang).build();
// Model에 데이터 저장하기 -> model.addAttribute("key",value); [String,Object]
model.addAttribute("demo", d); // 다른 페이지에서 사용할 데이터를 저장
return "demo/demoResult";
}
✅ @RequestParam 어노테이션을 이용해서 파라미터
값 받기
@RequestMapping("/demo/demo3.do")
public String requestParamuse(
@RequestParam(value="devName", defaultValue = "아무개") String name, // name 값이 없어도, devName인걸로 인식
@RequestParam(value="devAge", defaultValue="10") int age, // defaultValue = 기본값 (값이없으면 10으로 들어감)
@RequestParam(value="devGender") String gender,
@RequestParam(value="devEmail", required = false) String devEmail, // 필수값인지 아닌지 선택할때 -> required
String[] devLang, Model model) {
Demo d = Demo.builder()
.devName(name)
.devAge(age).devEmail(devEmail)
.devGender(gender).devLang(devLang).build();
model.addAttribute("demo", d);
return "demo/demoResult";
}
✅ DTO/VO 객체로 직접 parameter
값 받기
java.sql.Date
로 지정! @RequestMapping("/demo/demo4.do")
public String commandMapping(Demo demo, Model m) { // vo로 보낼때 알아서 값이 setter로 들어감
m.addAttribute("demo", demo);
return "demo/demoResult";
}
✅ Map으로 parameter
값 받기
@RequestMapping("/demo/demo5.do")
public String mapPapping(@RequestParam Map param, String[] devLang ,Model m) {
// Map으로 했을 때,배열값은 처리못함
param.put("devLang", devLang); // 직접 put메소드로 값을 넣어줘야함
m.addAttribute("demo", param);
return "demo/demoResult";
}
✅ 추가 데이터 받아오기
@RequestMapping("/demo/demo6.do")
public String extraData(
@CookieValue(value="testData",required = false, defaultValue = "rest-time") String data, // value="key값"
@RequestHeader(value="User-agent") String userAgent, // value="해더이름"
@SessionAttribute(value="sessionId") String sessionId, // value="세션key값"
@RequestHeader(value="Referer") String referer
){
System.out.println("쿠키 : "+data);
System.out.println("헤더 : "+userAgent);
System.out.println("세션 : "+sessionId);
System.out.println("이전페이지 : "+referer);
return "index";
}
✅ ModelAndView
객체를 이용해서 반환
ModelAndView
-> view 설정과, Model(데이터저장) 설정을 같이 할 수 있는 객체setViewName()
메소드를 이용해서 저장addObject("key",value)
메소드 이용해서 저장 @RequestMapping("/demo/demo7.do")
public ModelAndView modelAndViewReturn(Demo d, ModelAndView mv) {
mv.addObject("demo",d); // 데이터 저장
mv.setViewName("demo/demoResult"); // 뷰 저장
return mv; // 알아서 뷰에저장된 위치에 viewResolver 적용되서 이동
}
✅ Request 요청 메소드(GET, POST)를 필터링
@GetMapping
@PostMapping
@DeleteMapping
PutMapping
등이 있음parameter
값 받을 수 있음405 오류
-> 프런트에서 요청보낸곳의 보낸방식과 매핑에서 설정한 방식이 다르면 발생하는 오류@GetMapping("/demo/{no}") // @RequestMapping(value="/demo",method=RequestMethod.GET) 동일
public String searchDemo(@PathVariable(value ="no") int no) {
// /board/boardView?no=1
// /board/1 method=GET
return "demo/demoResult";
}
✅ Spring에서의 redirect
와 dispatcher
redirect
사용dispatcher
사용// redirect로 가는 방법
return "redirect:/demo/demo.do";
// dispatcher로 가는 방법
return "demo/demo";
@Service
어노테이션을 이용해서 서비스 클래스 위에 스프링 빈으로 등록한다package com.bs.spring.demo.service;
import java.util.List;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.bs.spring.demo.dao.DemoDao;
import com.bs.spring.demo.model.dto.Demo;
@Service // 서비스 스프링 빈으로 등록
public class DemoServiceImpl implements DemoService {
@Autowired
private DemoDao dao; // 인터페이스는 구현체를 찾음
@Autowired
private SqlSessionTemplate session;
@Override
public int insertDemo(Demo demo) {
return dao.insertDemo(session,demo);
}
@Override
public List<Demo> selectDemoAll() {
return dao.selectDemoAll(session);
}
}
@Repository
어노테이션을 이용해서 Dao 클래스 위에 스프링 빈으로 등록한다package com.bs.spring.demo.dao;
import java.util.List;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.stereotype.Repository;
import com.bs.spring.demo.model.dto.Demo;
@Repository
public class DemoDaoImpl implements DemoDao {
@Override
public int insertDemo(SqlSessionTemplate session,Demo m) {
return session.insert("dev.insertDemo",m); // 매퍼의 namespace값.id
}
@Override
public List<Demo> selectDemoAll(SqlSessionTemplate session) {
return session.selectList("dev.selectDemoAll");
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="dev">
<insert id="insertDemo" parameterType="demo">
INSERT INTO DEV VALUES(SEQ_DEV_NO.NEXTVAL,#{devName},
#{devAge},#{devEmail},#{devGender},
#{devLang, typeHandler=strArr})
</insert>
<select id="selectDemoAll" resultMap="demoMap">
SELECT * FROM DEV
</select>
<resultMap id="demoMap" type="demo"> <!-- 디비에서는 베열이 varchar2로 저장되어있어서 resultMap으로 해야함 -->
<result property="devLang" column="devLang" typeHandler="strArr"/>
<!-- 필요한것만 넣으면되고, has a 관계일때는 컬럼 다 넣어야함 -->
</resultMap>
</mapper>