마이바티스 스프링 설정
pom.xml 중요한 부분은 resources
<resources>
<resource>
<directory>src/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
<include>**/*.tld</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>board</groupId>
<artifactId>board</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jdbc</artifactId>
<version>8.5.27</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok-maven-plugin -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-maven-plugin</artifactId>
<version>1.18.20.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.2-b02</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.5</version>
</dependency>
</dependencies>
<build>
<sourceDirectory>src</sourceDirectory>
<resources>
<resource>
<directory>src/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
<include>**/*.tld</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>11</source>
<target>11</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.3</version>
<configuration>
<warSourceDirectory>WebContent</warSourceDirectory>
</configuration>
</plugin>
</plugins>
</build>
</project>
해당 위치 처럼 패키지, xml파일 설정
config-mybatis.xml ( 수정할 부분 없음 )
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<mappers>
<!-- 마이바티스 매퍼 XML 파일 -->
<mapper resource="mapper/MemberMapper.xml" />
</mappers>
</configuration>
MemberMapper.xml
해당 파일에 쿼리문 작성 후 인터페이스에 지정
#{PARAM1}같은 건 ? 대신 사용 PARAM1은 아무거나 써도 됨
<?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="mybatis.dao.MemberDAO">
<select id="selectCount" resultType="_int">
SELECT count(*)
FROM member
</select>
<select id="selectList" resultType="member.model.Member">
SELECT *
FROM member
</select>
<select id="selectById" parameterType="string" resultType="member.model.Member">
SELECT * FROM MEMBER WHERE MEMBERID = #{PARAM1}
</select>
<update id="updateArtilce">
update article set title = #{param1}, moddate = now()
where article_no = #{param2}
</update>
<insert id="insertArtCont" parameterType="article.model.ArticleContent">
insert into article_content(article_no, content) values(#{artCon.number}, #{artCon.content});
</insert>
<insert id="insertArticle" parameterType="article.model.Article"
useGeneratedKeys="true" keyProperty="number">
insert into article(writer_id, writer_name, title, regdate, moddate, read_cnt)
values (#{art.writer.id},#{art.writer.name},#{art.title},now(),now(),0)
</insert>
</mapper>
mybatis.dao 패키지안에 MemberDAO 인터페이스 생성
MemberMapper.xml 참고해서 만들기
package mybatis.dao;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import article.model.Article;
import article.model.ArticleContent;
import member.model.Member;
@Mapper
public interface MemberDAO {
@Select("select * from member")
List<Member> selectAll();
Integer selectCount();
List<Member> selectList();
Member selectById(String id);
void updateArtilce(String title, int num);
void insertArtCont(@Param("artCon") ArticleContent articleContent);
void insertArticle(@Param("art") Article article);
}
스프링 config에 MapperScan + SqlSessionFactory 설정
@Configuration
@EnableTransactionManagement
@MapperScan(basePackages = "mybatis.dao")
public class ControllerConfig {
@Bean(destroyMethod = "close")
public DataSource dataSource() {
DataSource ds = new DataSource();
ds.setDriverClassName("com.mysql.cj.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:3306/board?" + "useSSL=true&useUnicode=true&characterEncoding=utf8");
ds.setUsername("jspexam");
ds.setPassword("jsppw");
ds.setInitialSize(2);
ds.setMaxActive(10);
return ds;
}
@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dataSource());
factoryBean.setConfigLocation(new PathMatchingResourcePatternResolver().getResource("classpath:config-mybatis.xml"));
//factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:/mapper/**/*.xml"));
factoryBean.setTypeAliasesPackage("mybatis.dao");
return factoryBean.getObject();
}
// @Bean // 필요할 때 사용
// public SqlSessionFactory sqlSessionFactory() throws Exception {
// SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();
// sqlSessionFactory.setDataSource(dataSource());
// return (SqlSessionFactory) sqlSessionFactory.getObject();
// }
@Bean
public SqlSessionTemplate sqlSessionTemplate() throws Exception {
return new SqlSessionTemplate(sqlSessionFactory());
}
마이바티스 테스트
package controller;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import article.dao.ArticleContentDao;
import article.dao.ArticleDao;
import auth.service.LoginService;
import member.dao.MemberDao;
import member.model.Member;
import member.service.ChangePasswordService;
import mybatis.dao.MemberDAO;
@Controller
public class MyController {
@Autowired
private ArticleContentDao articleContentDao;
@Autowired
private ArticleDao articleDao;
@Autowired
private MemberDAO memberDAO;
@Autowired
private MemberDao memberDao;
@Autowired
private LoginService loginService;
@Autowired
private ChangePasswordService changePasswordService;
@GetMapping("/count")
public String countMember() {
마이바티스 테스트
List<Member> list = memberDAO.selectAll();
System.out.println(list);
System.out.println(memberDAO.selectCount());
List<Member> list = memberDAO.selectList();
for(Member member : list) {
System.out.println(member);
}
Member member = memberDAO.selectById("test3");
System.out.println(member);
memberDAO.updateArtilce("글제목 369", 12);
ArticleContent artc1 = new ArticleContent(105, "김기철");
memberDAO.insertArtCont(artc1);
Writer wr = new Writer("test34", "홍길동34");
Article art = new Article(0, wr, "홍길동 테스트", null, null, 0);
memberDAO.insertArticle(art);
// System.out.println(art);
스프링5 MVC 게시판
DAO
ArticleContentDao
package article.dao;
import java.util.List;
import org.apache.tomcat.jdbc.pool.DataSource;
import org.springframework.jdbc.core.JdbcTemplate;
import article.model.ArticleContent;
public class ArticleContentDao {
private JdbcTemplate jdbcTemplate;
public ArticleContentDao(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
// 게시물 내용을 삽입
public ArticleContent insert(ArticleContent content) {
String sql = "insert into article_content (article_no, content) values (?,?)";
int insertedCount
= jdbcTemplate.update(sql, content.getNumber(),content.getContent());
if (insertedCount > 0) {
return content;
} else {
return null;
}
}
// 특정 ID에 해당하는 게시물 내용을 조회
public ArticleContent selectById(int no){
String sql = "select * from article_content where article_no = ?";
List<ArticleContent> list = jdbcTemplate.query(sql, (rs, n)->{
return new ArticleContent(
rs.getInt("article_no"),
rs.getString("content"));
},no);
return list.isEmpty() ? null : list.get(0);
}
// 특정 ID에 해당하는 게시물 내용을 업데이트
public int update(int no, String content) {
String sql = "update article_content set content = ? where article_no = ?";
return jdbcTemplate.update(sql, content, no);
}
}
ArticleDao
package article.dao;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.Date;
import java.util.List;
import org.apache.tomcat.jdbc.pool.DataSource;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;
import article.model.Article;
import article.model.Writer;
public class ArticleDao {
private JdbcTemplate jdbcTemplate;
public ArticleDao(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
// public Article insert(Article article) {
//
// String sql = "insert into article"
// + "(writer_id, writer_name, title, regdate, moddate, read_cnt)"
// + "values (?,?,?,now(),now(),0)";
// int insertedCount = jdbcTemplate.update(sql, article.getWriter().getId(),
// article.getWriter().getName(),
// article.getTitle());
// if (insertedCount > 0) {// 스프링 197페이지
// int num = jdbcTemplate.queryForObject("select last_insert_id()"
// , Integer.class);
// article.setNumber(num);
// return article;
// }return null;
//
// }
// 게시물 추가 메서드
// 201~203쪽 keyHolder, 람다식
public Article insert(Article article) {
String sql = "insert into article"
+ "(writer_id, writer_name, title, regdate, moddate, read_cnt) values (?,?,?,now(),now(),0)";
KeyHolder keyHolder = new GeneratedKeyHolder();
jdbcTemplate.update((con) -> {
PreparedStatement pstm = con.prepareStatement(sql, new String[] {"article_no"});
pstm.setString(1, article.getWriter().getId());
pstm.setString(2, article.getWriter().getName());
pstm.setString(3, article.getTitle());
return pstm;
},keyHolder);
// 자동 생성된 키 값 가져오기 및 설정
Number keyvalue = keyHolder.getKey();
article.setNumber(keyvalue.intValue());
return article;
}
// 전체 게시물 개수 조회
private Timestamp toTimestamp(Date date) {
return new Timestamp(date.getTime());
}
public int selectCount() {
String sql = "select count(*) from article";
return jdbcTemplate.queryForObject(sql, Integer.class);
}
// 특정 범위의 게시물 목록 조회
public List<Article> select(int startRow, int size) {
String sql = "select * from article order by article_no desc limit ?, ?";
return jdbcTemplate.query(sql,
(rs, n)-> convertArticle(rs), startRow, size);
}
// ResultSet을 Article 객체로 변환
private Article convertArticle(ResultSet rs) throws SQLException {
return new Article(rs.getInt("article_no"),
new Writer(
rs.getString("writer_id"),
rs.getString("writer_name")),
rs.getString("title"),
toDate(rs.getTimestamp("regdate")),
toDate(rs.getTimestamp("moddate")),
rs.getInt("read_cnt"));
}
// Timestamp를 Date로 변환
private Date toDate(Timestamp timestamp) {
return new Date(timestamp.getTime());
}
// 특정 ID에 해당하는 게시물 조회
public Article selectById(int no) {
String sql = "select * from article where article_no = ?";
List<Article> list = jdbcTemplate.query(sql,
(rs, n) -> convertArticle(rs), no);
return list.isEmpty() ? null : list.get(0);
}
// 게시물의 조회수 증가
public void increaseReadCount(int no) {
String sql = "update article set read_cnt = read_cnt + 1 where article_no = ?";
jdbcTemplate.update(sql, no);
}
// 게시물 정보 업데이트 메서드
public int update(int no, String title) {
String sql = "update article set title = ?, moddate = now() where article_no = ?";
return jdbcTemplate.update(sql, title, no);
}
// 게시물 삭제 메서드
public int delete(int no) {
String sql = "delete from article where article_no =?";
return jdbcTemplate.update(sql, no);
}
}
Service ( 종류가 많아서 GitHub 주소 참고 )
Config
package config;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.tomcat.jdbc.pool.DataSource;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import article.dao.ArticleContentDao;
import article.dao.ArticleDao;
import article.service.ListArticleService;
import article.service.ModifyArticleService;
import article.service.ReadArticleService;
import article.service.WriteArticleService;
import auth.service.LoginService;
import controller.ArtController;
import controller.LogController;
import controller.MyController;
import member.dao.MemberDao;
import member.service.ChangePasswordService;
import member.service.JoinService;
@Configuration
@EnableTransactionManagement
@MapperScan(basePackages = "mybatis.dao")
public class ControllerConfig {
@Bean(destroyMethod = "close")
public DataSource dataSource() {
DataSource ds = new DataSource();
ds.setDriverClassName("com.mysql.cj.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:3306/board?" + "useSSL=true&useUnicode=true&characterEncoding=utf8");
ds.setUsername("jspexam");
ds.setPassword("jsppw");
ds.setInitialSize(2);
ds.setMaxActive(10);
return ds;
}
@Bean
public MemberDao memberDao() {
return new MemberDao(dataSource());
}
@Bean
public LoginService loginService() {
return new LoginService();
}
@Bean
public ChangePasswordService changePasswordService() {
return new ChangePasswordService();
}
@Bean
public JoinService joinService() {
return new JoinService();
}
@Bean
public PlatformTransactionManager transactionManager() {
DataSourceTransactionManager tm = new DataSourceTransactionManager();
tm.setDataSource(dataSource());
return tm;
}
@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dataSource());
factoryBean.setConfigLocation(new PathMatchingResourcePatternResolver().getResource("classpath:config-mybatis.xml"));
//factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:/mapper/**/*.xml"));
factoryBean.setTypeAliasesPackage("mybatis.dao");
return factoryBean.getObject();
}
// @Bean
// public SqlSessionFactory sqlSessionFactory() throws Exception {
// SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();
// sqlSessionFactory.setDataSource(dataSource());
// return (SqlSessionFactory) sqlSessionFactory.getObject();
// }
@Bean
public SqlSessionTemplate sqlSessionTemplate() throws Exception {
return new SqlSessionTemplate(sqlSessionFactory());
}
@Bean
public MyController myController() {
return new MyController();
}
@Bean
public LogController logController() {
return new LogController();
}
@Bean
public ArticleContentDao articleContentDao() {
return new ArticleContentDao(dataSource());
}
@Bean
public ArticleDao articleDao() {
return new ArticleDao(dataSource());
}
@Bean
public ListArticleService listArticleService() {
return new ListArticleService();
}
@Bean
public ModifyArticleService modifyArticleService() {
return new ModifyArticleService();
}
@Bean
public ReadArticleService readArticleService() {
return new ReadArticleService();
}
@Bean
public WriteArticleService writeArticleService() {
return new WriteArticleService();
}
@Bean
ArtController artController() {
return new ArtController();
}
}
package config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
@EnableWebMvc
public class MvcConfig implements WebMvcConfigurer {
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.jsp("/WEB-INF/view/", ".jsp");
}
}
controller
package controller;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import article.model.Writer;
import article.service.ArticleContentNotFoundException;
import article.service.ArticleData;
import article.service.ArticleNotFoundException;
import article.service.ArticlePage;
import article.service.ListArticleService;
import article.service.ModifyArticleService;
import article.service.ModifyRequest;
import article.service.PermissionDeniedException;
import article.service.ReadArticleService;
import article.service.WriteArticleService;
import article.service.WriteRequest;
import auth.service.User;
@Controller
public class ArtController {
@Autowired
private ListArticleService listArticleService;
@Autowired
private ModifyArticleService modifyArticleService;
@Autowired
private ReadArticleService readArticleService;
@Autowired
private WriteArticleService writeArticleService;
///article/write.do=article.command.WriteArticleHandler
///article/list.do=article.command.ListArticleHandler
///article/read.do=article.command.ReadArticleHandler
///article/modify.do=article.command.ModifyArticleHandler
@GetMapping("/article/list.do")
public String listArticle(HttpServletRequest req) {
String pageNoVal = req.getParameter("pageNo");
int pageNo = 1;
if (pageNoVal != null) {
pageNo = Integer.parseInt(pageNoVal);
}
ArticlePage articlePage = listArticleService.getArticlePage(pageNo);
req.setAttribute("articlePage", articlePage);
return "listArticle";
}
@GetMapping("/article/read.do")
public String readArticle(HttpServletRequest req, HttpServletResponse res) {
String noVal = req.getParameter("no");
int articleNum = Integer.parseInt(noVal);
try {
ArticleData articleData = readArticleService.getArticle(articleNum, true);
req.setAttribute("articleData", articleData);
return "readArticle";
} catch (ArticleNotFoundException | ArticleContentNotFoundException e) {
req.getServletContext().log("no article", e);
try {
res.sendError(HttpServletResponse.SC_NOT_FOUND);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
return null;
}
}
@GetMapping("/article/write.do")
public String writeArticle1() {
return "newArticleForm";
}
private WriteRequest createWriteRequest(User user, HttpServletRequest req) {
return new WriteRequest(
new Writer(user.getId(), user.getName()),
req.getParameter("title"),
req.getParameter("content"));
}
@PostMapping("/article/write.do")
public String writeArticle2(HttpServletRequest req, HttpServletResponse res) {
Map<String, Boolean> errors = new HashMap<>();
req.setAttribute("errors", errors);
User user = (User)req.getSession(false).getAttribute("authUser");
WriteRequest writeReq = createWriteRequest(user, req);
writeReq.validate(errors);
if (!errors.isEmpty()) {
return "newArticleForm";
}
int newArticleNo = writeArticleService.write(writeReq);
req.setAttribute("newArticleNo", newArticleNo);
return "newArticleSuccess";
}
@GetMapping("/article/delete.do")
public String delete(){
return "delete";
}
private boolean canModify(User authUser, ArticleData articleData) {
String writerId = articleData.getArticle().getWriter().getId();
return authUser.getId().equals(writerId);
}
@GetMapping("/article/modify.do")
public String modifyArticle1(HttpServletRequest req, HttpServletResponse res) {
try {
String noVal = req.getParameter("no");
int no = Integer.parseInt(noVal);
ArticleData articleData = readArticleService.getArticle(no, false);
User authUser = (User) req.getSession().getAttribute("authUser");
if (!canModify(authUser, articleData)) {
res.sendError(HttpServletResponse.SC_FORBIDDEN);
return null;
}
ModifyRequest modReq = new ModifyRequest(authUser.getId(), no,
articleData.getArticle().getTitle(),
articleData.getContent());
req.setAttribute("modReq", modReq);
return "modifyForm";
} catch (ArticleNotFoundException | IOException e) {
try {
res.sendError(HttpServletResponse.SC_NOT_FOUND);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
return null;
}
}
@PostMapping("/article/modify.do")
public String modifyArticle2(HttpServletRequest req, HttpServletResponse res) {
User authUser = (User) req.getSession().getAttribute("authUser");
String noVal = req.getParameter("no");
int no = Integer.parseInt(noVal);
ModifyRequest modReq = new ModifyRequest(authUser.getId(), no,
req.getParameter("title"),
req.getParameter("content"));
req.setAttribute("modReq", modReq);
Map<String, Boolean> errors = new HashMap<>();
req.setAttribute("errors", errors);
modReq.validate(errors);
if (!errors.isEmpty()) {
return "modifyForm";
}
try {
modifyArticleService.modify(modReq);
return "modifySuccess";
} catch (ArticleNotFoundException e) {
try {
res.sendError(HttpServletResponse.SC_NOT_FOUND);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
return null;
} catch (PermissionDeniedException e) {
try {
res.sendError(HttpServletResponse.SC_FORBIDDEN);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
return null;
}
}
}
'프로젝트 기반 자바(JAVA) 응용 SW개발자 취업과정' 카테고리의 다른 글
2023-08-17 63일차 (0) | 2023.08.17 |
---|---|
2023-08-16 62일차 (0) | 2023.08.16 |
2023-08-10 60일차 (0) | 2023.08.10 |
2023-08-09 59일차 (0) | 2023.08.09 |
2023-08-08 58일차 (0) | 2023.08.08 |