Spring基本


Spring理論


概要



Springが理解しなければならない3つの概念

  • IOC(Inversion Of Control)
  • DL(Dependency Lookup)
  • DI(Dependency Injection)
  • AOP(Aspect Oriented Programming)
  • Interceptor
  • AOP / Interceptor / Filter


    リクエストが相次いだ場合、前の手順でいくつかの操作があります.

    ファイルの設定


    web.xml + Filter


    すべてのリクエスト(/*)にエンコードフィルタを設定

    今の仕事に行けばネットxmlを開く どのlistenerとfilterが設定されていますか 目で見るのが先だ

    servlet-context.xml

  • アーキテクチャに基づく設定
  • xmlファイルで
  • を設定
  • アレイベースの設定
    構成
  • コード上の
  • オブジェクト
  • を生成する.
  • ViewResolverは、パスからの要求を転送するように構成される.jspの追加
  • 四半期

  • Springでは、MVCコントローラファクトリのjavaコードはプロファイルの
  • にあります.
  • Spring内部のxxxMapperは、ユーザの要求を受け取ると、説明されたパッケージに従ってコントローラをスキャンし、適切なコントローラ
  • を見つける.

    Tomcatサーバの使用


    サーバの追加




    ポート番号の競合を回避するために変更



    Root Pathに変更



    Controller


    Annotation


    Annotationを使用してクラス、インスタンス管理をFrameworkに委任→ コントロールの反転
    @Component
    -- @Controller
    -- @Services
    -- @Repository
    // UserCtrl.java
    package com.sinc.intern.user.ctrl;
    
    import org.springframework.stereotype.Controller;
    
    @Controller
    public class UserCtrl {
    
    }

    コントローラのリカバリタイプ


    コントローラの戻りタイプは、通常Stringの->jspファイル名です.
    メソッドの戻りタイプやパラメータなどの構文タイプには制約がありません
    Annotationがユーザ要求をコントローラメソッドにマッピングする
    // UserCtrl.java
    package com.sinc.intern.user.ctrl;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    
    @Controller
    public class UserCtrl {
    
    	@RequestMapping(value="/login.do", method=RequestMethod.POST) // 설정 가능
    	public String login() {
    
    	}
    
    	@RequestMapping("/logout.do")
    	public String logout() {
    
    	}
    
    	@RequestMapping("/join.do")
    	public String join() {
    
    	}
    
    	@RequestMapping("/search.do")
    	public String search() {
    
    	}
    }

    jspファイルの場所


    viewsディレクトリにjspファイルを入れる必要があります
    // home.jsp
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
    <%@ page session="false"%>
    <html>
    <head>
    <title>Home</title>
    </head>
    <body>
    	<h1>Hello world!</h1>
    
    	<P>This is a Spring Framework by J.S.LIM</P>
    </body>
    </html>

    コントローラ戻り値


    Controllerメソッドは、ファイルの論理名(拡張子を除く)を返します.
    // UserCtrl.java
    package com.sinc.intern.user.ctrl;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    
    import com.sinc.intern.user.model.vo.UserDTO;
    
    @Controller
    public class UserCtrl {
    
    	@RequestMapping()
    	public String login(UserDTO dto) {
    		System.out.println("ctrl login");
    		System.out.println("UserDTO: " + dto);
    		return "home";
    	}
    
    	@RequestMapping("/logout.do")
    	public String logout() {
    		return null;
    	}
    
    	@RequestMapping("/join.do")
    	public String join() {
    		return null;
    	}
    
    	@RequestMapping("/search.do")
    	public String search() {
    		return null;
    	}
    }

    UserVOとUserDTOの作成

    // UserVO.java
    package com.sinc.intern.user.model.vo;
    
    public class UserVO {
    	private String id, pwd, name;
    	private double point;
    	private String dept;
    
    	public UserVO() {
    		// TODO Auto-generated constructor stub
    	}
    
    	public UserVO(String id, String pwd, String name, double point, String dept) {
    		super();
    		this.id = id;
    		this.pwd = pwd;
    		this.name = name;
    		this.point = point;
    		this.dept = dept;
    	}
    
    	public String getId() {
    		return id;
    	}
    
    	public void setId(String id) {
    		this.id = id;
    	}
    
    	public String getPwd() {
    		return pwd;
    	}
    
    	public void setPwd(String pwd) {
    		this.pwd = pwd;
    	}
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	public double getPoint() {
    		return point;
    	}
    
    	public void setPoint(double point) {
    		this.point = point;
    	}
    
    	public String getDept() {
    		return dept;
    	}
    
    	public void setDept(String dept) {
    		this.dept = dept;
    	}
    
    	@Override
    	public String toString() {
    		return "UserVO [id=" + id + ", pwd=" + pwd + ", name=" + name + ", point=" + point + ", dept=" + dept + "]";
    	}
    
    }
    // UserDTO.java
    package com.sinc.intern.user.model.vo;
    
    public class UserDTO {
    	private String id, pwd;
    
    	public UserDTO() {
    		// TODO Auto-generated constructor stub
    	}
    
    	public UserDTO(String id, String pwd) {
    		super();
    		this.id = id;
    		this.pwd = pwd;
    	}
    
    	public String getId() {
    		return id;
    	}
    
    	public void setId(String id) {
    		this.id = id;
    	}
    
    	public String getPwd() {
    		return pwd;
    	}
    
    	public void setPwd(String pwd) {
    		this.pwd = pwd;
    	}
    
    	@Override
    	public String toString() {
    		return "UserDTO [id=" + id + ", pwd=" + pwd + "]";
    	}
    
    }

    コントローラの戻りタイプはvoid


    ユーザ要求に基づくurl検索(logout.do,従ってlogout.jsp)
    // UserCtrl.jsp
    	@RequestMapping("/logout.do")
    	public void logout() { // 리턴타입이 void
    		System.out.println("ctrl logout");
    	}

    ModelAndView return

    // UserCtrl.java
    	@RequestMapping("/join.do")
    	public ModelAndView join(ModelAndView mv) {
    		System.out.println("ctrl join");
    		mv.addObject("msg", "Hi, JSLIM");
    		mv.setViewName("home");
    		return mv;
    	}
    // home.jsp
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
    <%@ page session="false"%>
    <html>
    <head>
    <title>Home</title>
    </head>
    <body>
    	<h1>Hello world!</h1>
    
    	<P>This is a Spring Framework by J.S.LIM ${msg}</P>
    </body>
    </html>

    モデルAndViewからのみモデルを分離(推奨)

    // UserCtrl.java
    	@RequestMapping("/search.do")
    	public String search(Model model) {
    		System.out.println("ctrl search");
    		model.addAttribute("msg", "using model 섭쌤 추천~~~~~~~");
    		return "home";
    	}

    UserVO return

    // UserCtrl.java
    	@RequestMapping("/ajax.do")
    	@ResponseBody // 비동기 통신
    	public UserVO ajax() {
    		System.out.println("ctrl ajax");
    		return new UserVO("jslim", "jslim", "임정섭", 1000, "EMART");
    	}

    完全なUserCtrl

    // UserCtrl.java
    package com.sinc.intern.user.ctrl;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    import org.springframework.web.servlet.ModelAndView;
    
    import com.sinc.intern.user.model.vo.UserDTO;
    import com.sinc.intern.user.model.vo.UserVO;
    
    @Controller
    public class UserCtrl {
    
    	@RequestMapping()
    	public String login(UserDTO dto) { // 리턴타입이 String
    		System.out.println("ctrl login");
    		System.out.println("UserDTO: " + dto);
    		return "home";
    	}
    
    	@RequestMapping("/logout.do")
    	public void logout() { // 리턴타입이 void
    		System.out.println("ctrl logout");
    	}
    
    	@RequestMapping("/join.do")
    	public ModelAndView join(ModelAndView mv) {
    		System.out.println("ctrl join");
    		mv.addObject("msg", "Hi, JSLIM");
    		mv.setViewName("home");
    		return mv;
    	}
    
    	@RequestMapping("/search.do")
    	public String search(Model model) {
    		System.out.println("ctrl search");
    		model.addAttribute("msg", "using model 섭쌤 추천~~~~~~~");
    		return "home";
    	}
    
    	@RequestMapping("/ajax.do")
    	@ResponseBody // 비동기 통신
    	public UserVO ajax() {
    		System.out.println("ctrl ajax");
    		return new UserVO("jslim", "jslim", "임정섭", 1000, "EMART");
    	}
    
    }

    ログイン機能の実装


    Welcome page


    index.jspのmain.doを使用してurlを接続する
    // index.jsp
    <%@ page language="java" contentType="text/html; charset=UTF-8"
    	pageEncoding="UTF-8"%>
    
    <script type="text/javascript">
    	location.href = "main.do";
    </script>
    HomeControllerからMainへ.do urlを実際のホームページjspファイルのホームとします.jsp接続で返す
    // HomeController
    package com.sinc.intern;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    @Controller
    public class HomeController {
    
    	@RequestMapping("/main.do")
    	public String home() {
    		System.out.println("ctrl main");
    		return "home";
    	}
    }

    Service


    @サービス サービスとして宣言しながら別名を指定
    コントローラで@Resourceを使用して別名タイプのオブジェクトを作成して割り当てる
    // UserCtrl.java
    package com.sinc.intern.user.ctrl;
    
    import javax.annotation.Resource;
    import javax.servlet.http.HttpSession;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    
    import com.sinc.intern.user.model.vo.UserDTO;
    import com.sinc.intern.user.service.UserService;
    
    @Controller
    public class UserCtrl {
    
    	@Resource(name = "userS") // 의존성 주입
    	private UserService service;
    
    	@RequestMapping("/loginForm.do")
    	public String loginForm() {
    		System.out.println("user loginForm");
    		return "user/login";
    	}
    
    	@RequestMapping(value = "/login.do", method = RequestMethod.POST)
    	public String login(UserDTO dto, HttpSession session) {
    		System.out.println("user login dto: " + dto);
    		Object user = service.login(dto);
    		if (user != null) {
    			session.setAttribute("loginUser", user);
    		}
    		return "redirect:/main.do";
    	}
    }
    注意@Serviceをインスタンスを生成するUserServiceImplクラスに忘れないでください
    // UserService.java
    package com.sinc.intern.user.service;
    
    public interface UserService {
    
    	public Object login(Object obj);
    
    }
    
    // UserServiceImpl.java
    package com.sinc.intern.user.service;
    
    import javax.annotation.Resource;
    
    import org.springframework.stereotype.Service;
    
    import com.sinc.intern.user.model.sql.UserDao;
    
    @Service("userS") // Annotation 까먹지 않도록 주의, 별칭 부여 가능
    public class UserServiceImpl implements UserService {
    
    	@Resource(name = "userD")
    	private UserDao dao;
    
    	@Override
    	public Object login(Object obj) {
    		System.out.println("user service login");
    		return null;
    	}
    
    }
    クラスファイルで@Service(「users」)と
    root-context.xmlでbeanタグを使用して説明する(モードベースの設定)は同じです
    // root-context.xml
    
    <bean id="userS" class="com.sinc.intern.user.service.UserServiceImpl">
    </bean>
    ただし,@Resources宣言は依存性注入時に便利である.
    現在の業界では,サービス説明と依存性注入はいずれも模倣に基づいているか,あるいはサービス説明はモデルに基づいており,依存性注入は模倣に基づいて混用されている.

    Dao


    @Repository Daoとして宣言しながら別名を指定
    サービスによって@Resourceによって作成され、その別名を持つタイプのオブジェクトが割り当てられます.
    // UserServiceImpl.java
    package com.sinc.intern.user.model.sql;
    
    import javax.annotation.Resource;
    
    import org.apache.ibatis.session.SqlSession;
    import org.springframework.stereotype.Repository;
    
    @Repository("userD")
    public class UserDaoImpl implements UserDao {
    
    	@Resource(name = "sqlSession")
    	private SqlSession session;
    
    	@Override
    	public Object loginRow(Object obj) {
    		System.out.println("user dao loginRow: " + obj);
    		System.out.println("user dao conn: " + session);
    		return null;
    	}
    
    }
    注意インスタンスを生成するUserDaoImplクラスで@Repositoryを忘れないでください
    // UserDao.java
    package com.sinc.intern.user.model.sql;
    
    public interface UserDao {
    
    	public Object loginRow(Object obj);
    
    }
    
    // UserDaoImpl.java
    package com.sinc.intern.user.model.sql;
    
    import org.springframework.stereotype.Repository;
    
    @Repository("userD")
    public class UserDaoImpl implements UserDao {
    
    	@Override
    	public Object loginRow(Object obj) {
    		System.out.println("user dao loginRow");
    		return null;
    	}
    
    }
    DAO-MyBasisへのデータのインポート
    // UserDaoImpl.java
    package com.sinc.intern.user.model.sql;
    
    import javax.annotation.Resource;
    
    import org.apache.ibatis.session.SqlSession;
    import org.springframework.stereotype.Repository;
    
    @Repository("userD")
    public class UserDaoImpl implements UserDao {
    
    	public static final String PREFIX = "com.sinc.intern.test";
    
    	@Resource(name = "sqlSession")
    	private SqlSession session;
    
    	@Override
    	public Object loginRow(Object obj) {
    		System.out.println("user dao loginRow: " + obj);
    		System.out.println("user dao conn: " + session);
    
    		Object result = session.selectOne(PREFIX + ".login", obj);
    		System.out.println("dao loginRow result: " + result);
    
    		return result;
    	}
    
    }
    testMapper.xmlでSQL文を作成する
    絶対セミコロン(;)使えない
    // testMapper.xml
    <?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="com.sinc.intern.test">
    	<select id="login" parameterType="userdto" resultType="uservo">
    		SELECT ID, PWD, NAME, POINT, DEPT
    		FROM INTERN_USER_TBL
    		WHERE ID = #{id} AND PWD = #{pwd}
    	</select>
    </mapper>
    SQLで使用されるパラメータと結果タイプの説明
    絶対セミコロン(;)使えない
    // mybatis-config.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>
    
    	<typeAliases>
    		<typeAlias type="com.sinc.intern.user.model.vo.UserDTO"
    			alias="userdto" />
    		<typeAlias type="com.sinc.intern.user.model.vo.UserVO"
    			alias="userdto" />
    	</typeAliases>
    
    </configuration>

    JSPのフォームタグ


    login.doに接続し、フォームタグのidとpwd値をUserCtrlのloginメソッドに渡す
    // login.jsp
    			<form action="login.do" method="post">
    				<div class="form-group has-feedback">
    					<input type="text" name="id" class="form-control"
    						placeholder="USER ID" /> <span
    						class="glyphicon glyphicon-envelope form-control-feedback"></span>
    				</div>
    				<div class="form-group has-feedback">
    					<input type="password" name="pwd" class="form-control"
    						placeholder="Password" /> <span
    						class="glyphicon glyphicon-lock form-control-feedback"></span>
    				</div>
    				<div class="row">
    					<div class="col-xs-8">
    						<div class="checkbox icheck">
    							<label> <input type="checkbox" name="useCookie">
    								Remember Me
    							</label>
    						</div>
    					</div>
    					<!-- /.col -->
    					<div class="col-xs-4">
    						<button type="submit" class="btn btn-primary btn-block btn-flat">Sign
    							In</button>
    					</div>
    					<!-- /.col -->
    				</div>
    			</form>
    // UserCtrl.java
    	@RequestMapping(value = "/login.do", method = RequestMethod.POST)
    	public String login(UserDTO dto, HttpSession session) {
    		System.out.println("user login dto: " + dto);
    		Object user = service.login(dto);
    		if (user != null) {
    			session.setAttribute("loginUser", user);
    		}
    		return "redirect:/main.do";
    	}
    出典:SHINSEGAE I&C実習