要求プロセスにおけるライブサーバー-5-SpringBoot

:ライブ項目
1. アイデアIDEがSpringBoot構築
2. 逆ジェネレータはPOJO、マッパーおよびXMLインターフェイスを生成MyBatisの
3 WebMvcConfigurerAdapter資源がノックダウン
4. 史郎に簡単な使用を

上記の記事では、我々は、ユーザ認証と権限をビルドSpringboot環境、構成データベース、POJO、MyBatisのマッピングファイル、ダオ層、MVCの設定、リソースのフィルタリングやブロッキングを完了しました。MVCパターンで使用されているSpringMvc、と春は、一般的に、そしてMVCは、我々はデータを要求する方法を、リクエストサービス層にどのように応答するかを、モデルの作成、書き込みに次の層のコントローラーを完了しました。

春の注釈

SpringBootで、次のような共通の注釈:

  1. @Controller:コントローラは、クラスを定義するために使用される、対応するサービス・インターフェース(サービス層)に、ユーザによって送信されたURL要求を転送する責任コントローラのばね羨望
  2. @ RequestMapping:ルーティング情報、コントローラの特定の機能に複雑なURLマッピングを提供します。相対アドレスは通常、要求を含む、\ POSTリクエストメソッドをGETなど
  3. @ResponseBody:この結果は、方法は、注釈の場合、JSONの戻り値のデータ、注釈関数の戻り値を解決するためにジャンプパスを使用せず,, HTTPレスポンスボディに直接書かれた注釈を返すことを示しています。一般的な使用方法は、Map <文字列、オブジェクト>で、キーJSONデータを設定することです。
  4. @RestController:ユーザは、制御層アセンブリを示し@ResponseBodyと@Controllerの集合です。アノテーションクラス定義されたクラスのメソッドは、すべてのタイプの値をJSONデータで返し。
  5. Getmapping PostMapping @ @:、メモを組み合わせたものです(メソッド= RequestMethod.GET \ POST)を@RequestMapping略語であるの
  6. @SpringBootApplication:SpringBootは自動的にプログラムに注釈を付けるように設定しましょう。
  7. @Configuration:Javaコードを通じて設定を設定するには、従来のXML設定ファイルの同等が、役割やクラスのノート。
  8. @import:他のコンフィギュレーション・クラスを導入するために使用
  9. @ImportResource:XML設定ファイルをロードするために使用
  10. @Autowired:自動的豆依存しばしばタグのクラスメンバ変数、メソッド、およびコンストラクタのために、自動的に直接豆を使用して設定注射、自動組立作業が完了しインポート。
  11. @Service:変更のためのコンポーネントサービス層

層の春の概念

おそらく、ここを参照してください、あなたのいくつかはダオ層が何であるか、疑問に思うだろう、サービス層、コントローラ層、それが何であるかは何ですか?なぜそれに対する応答を処理するためにコントローラを使うのか?@Controller注意コントローラは、それを行う必要がありますか?ここでは、コンセプトSpringMVC層を言及する必要があります。

  1. コントローラー層:特定のビジネスプロセスを制御する役割を担うモジュール、サービスコールインタフェース層は、ビジネス・プロセスを制御し、URLマッピングを実現します。春には、コントローラ層は、@コントローラー、@ RestControllerで表さ
  2. サービス層:その後、ダオの上に構築された層、コントローラの下で、ビジネスロジックの設計モジュールを担当し、インターフェースの最初の設計、およびその実装クラスを完了します。@Serviceによって層をマークするサービス
  3. ダオ層:Spring構成ファイルに永続的なデータの責任、およびカプセル化されたデータベースとの対話、ダオ・データ・ソース。主に、データベースのCRUDメソッドを実装し、サービスの拡張をサポートしています。@Daoで示さダオ層クラス。
  4. POJO:データエンティティクラス
    レイヤの概念.PNG SpringMVC

基準層、処理要求

MyBatisの-生成ツールは、作業ダオ層のほとんどを達成するために私たちを支援してきましたが、我々はまた、Spring構成ファイル内のデータソースを設定する必要があります。

概要以下のダオ層:

最初のマッピング界面層ダオあります。

ダオ-1.png
ここでUserMapper特別なニーズ(パス・サービスへのマージされた2つのエンティティのためのデータ)、一般的には、レイヤマッピングファイルダオは、修正を必要としない場合、例えば、マッピングするために。インターフェース名は、実質的に、データ一次キーまたは実施例に基準、次いで濾過したデータをフィルタリングすることも明らかです。ここで特に強調 updateByExample、updateByExampleSelective これら二つのインタフェース:

  • updateByExampleは:更新するときに属性がNULLに割り当てられますなしであるように、我々はすべてのプロパティが用意されているエンティティオブジェクトに必要
  • updateByExampleSelective:インタフェースのみ提供プロパティを変更するために、はるかに賢明である、他のおなじみ変わりません。
public interface UserMapper {
    int countByExample(UserExample example);  
    int deleteByExample(UserExample example);
    int deleteByPrimaryKey(Integer id);
    int insert(User record);
    int insertSelective(User record);
    List<User> selectByExample(UserExample example);
    User selectByPrimaryKey(Integer id);
    int updateByExampleSelective(@Param("record") User record, @Param("example") UserExample example);
    int updateByExample(@Param("record") User record, @Param("example") UserExample example);
    int updateByPrimaryKeySelective(User record);
    int updateByPrimaryKey(User record);
}
复制代码

ダオ特定のレイヤマッピングファイルを次のように

ダオ-2.png

<?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.ljh.dao.UserMapper" >
  <resultMap id="BaseResultMap" type="com.ljh.po.User" >
    <id column="id" property="id" jdbcType="INTEGER" />
    <result column="name" property="name" jdbcType="VARCHAR" />
    <result column="account" property="account" jdbcType="VARCHAR" />
    <result column="password" property="password" jdbcType="VARCHAR" />
    <result column="role_id" property="roleId" jdbcType="INTEGER" />
  </resultMap>
  <sql id="Example_Where_Clause" >
    <where >
      <foreach collection="oredCriteria" item="criteria" separator="or" >
        <if test="criteria.valid" >
          <trim prefix="(" suffix=")" prefixOverrides="and" >
            <foreach collection="criteria.criteria" item="criterion" >
              <choose >
                <when test="criterion.noValue" >
                  and ${criterion.condition}
                </when>
                <when test="criterion.singleValue" >
                  and ${criterion.condition} #{criterion.value}
                </when>
                <when test="criterion.betweenValue" >
                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
                </when>
                <when test="criterion.listValue" >
                  and ${criterion.condition}
                  <foreach collection="criterion.value" item="listItem" open="(" close=")" separator="," >
                    #{listItem}
                  </foreach>
                </when>
              </choose>
            </foreach>
          </trim>
        </if>
      </foreach>
    </where>
  </sql>
  <sql id="Update_By_Example_Where_Clause" >
    <where >
      <foreach collection="example.oredCriteria" item="criteria" separator="or" >
        <if test="criteria.valid" >
          <trim prefix="(" suffix=")" prefixOverrides="and" >
            <foreach collection="criteria.criteria" item="criterion" >
              <choose >
                <when test="criterion.noValue" >
                  and ${criterion.condition}
                </when>
                <when test="criterion.singleValue" >
                  and ${criterion.condition} #{criterion.value}
                </when>
                <when test="criterion.betweenValue" >
                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
                </when>
                <when test="criterion.listValue" >
                  and ${criterion.condition}
                  <foreach collection="criterion.value" item="listItem" open="(" close=")" separator="," >
                    #{listItem}
                  </foreach>
                </when>
              </choose>
            </foreach>
          </trim>
        </if>
      </foreach>
    </where>
  </sql>
  <sql id="Base_Column_List" >
    id, name, account, password, role_id
  </sql>
  <select id="selectByExample" resultMap="BaseResultMap" parameterType="com.ljh.po.UserExample" >
    select
    <if test="distinct" >
      distinct
    </if>
    <include refid="Base_Column_List" />
    from user
    <if test="_parameter != null" >
      <include refid="Example_Where_Clause" />
    </if>
    <if test="orderByClause != null" >
      order by ${orderByClause}
    </if>
  </select>
  <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer" >
    delete from user
    where id = #{id,jdbcType=INTEGER}
  </delete>
  <insert id="insert" parameterType="com.ljh.po.User" >
    insert into user (id, name, account, 
      password, role_id)
    values (#{id,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR}, #{account,jdbcType=VARCHAR}, 
      #{password,jdbcType=VARCHAR}, #{roleId,jdbcType=INTEGER})
  </insert>
  <update id="updateByExample" parameterType="map" >
    update user
    set id = #{record.id,jdbcType=INTEGER},
      name = #{record.name,jdbcType=VARCHAR},
      account = #{record.account,jdbcType=VARCHAR},
      password = #{record.password,jdbcType=VARCHAR},
      role_id = #{record.roleId,jdbcType=INTEGER}
    <if test="_parameter != null" >
      <include refid="Update_By_Example_Where_Clause" />
    </if>
  </update>
</mapper>
复制代码

コードは、最初のマッピング・ファイル内の最後に、各インタフェース・ファイル・データベースに対して実施される、XMLファイルのタイプを定義し、データベースで定義されたユーザクラスとクラス属性を定義し、次いで実施例を定義し、切断されました。

上記のカテゴリは、逆マッピングファイルは、データベースによって生成されているので、私は中SpringBoot内のデータを照会する必要がある場合、私はそれを見に行きますか?この時間は、それがデータ・ソースを定義する必要があります。application.propertiesプロジェクトで、次の設定ファイルを追加します。

#数据源配置,默认使用tomcate-jdbc连接池
spring.datasource.url=jdbc:mysql://数据库地址:3306/数据库名字?useUnicode=true&characterEncoding=UTF8
spring.datasource.username=用户名
spring.datasource.password=用户密码
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
复制代码

サービス層

今、あなたは我々がサービス層を見て、その後、ダオ層とデータベースの間の障壁を開いたことは、彼の値を達成する方法です。コードを書くとき、私はインターフェイスは、さまざまなシナリオを実行することができ、何を行うことができない限り、考えることを敢えてとして、考えていません。柔軟な、それは、サービス・インターフェースの私の評価です。

public interface UserService {
  ...
    /**
     * 注册成功则无异常抛出
     * 用户名/手机被使用,则抛出异常
     * @param user
     * @throws ServiceException
     */
    void register(User user) throws ServiceException;

    /**
     * 查找相似的user
     * @param likeUser
     * @return
     */
    List<User> getUsers(User likeUser);
}
复制代码

だから、シーンのユーザーオブジェクトの実装とアプリケーションを渡すことによって、同様のユーザーインターフェイスを取得するために常に変化しています。のは、簡単な方法を見てみましょう:

@Service
public class UserServiceImpl implements UserService {
    private static final Logger log = LoggerFactory.getLogger(UserServiceImpl.class);

    @Autowired
    private UserMapper userMapper;  //Dao层接口

    @Override
    public List<User> getUsers(User likeUser) {
        //构造example
        UserExample example = new UserExample();
        UserExample.Criteria criteria = example.createCriteria();
        if (null != likeUser) {
            if (null != likeUser.getId()) {
                criteria.andIdEqualTo(likeUser.getId());
            }
            if (null != likeUser.getName()) {
                criteria.andNameLike("%" + likeUser.getName() + "%");
            }
            if (null != likeUser.getAccount()) {
                criteria.andNameLike("%" + likeUser.getAccount() + "%");
            }
        }
        return userMapper.selectByExample(example);
    }
}
复制代码

着信ユーザオブジェクトが決意属性上記の実装では、存在する場合には、ダオ同様のユーザ層によって取得されたデータに続いて、例えば、条件に追加されます。このインタフェースは、ユーザーの属性ならば、その後、より複雑な、ユーザーがソート機能を実現することができ、ユーザーに関する情報を表示するファジー検索ユーザーのために使用することができます。

コントローラ層

層制御要求を初めて目にはURLを取り扱います

  1. URL要求の現在の方法に対応する(パス= { "XXX"}、メソッド= {RequestMethod.GET / POST})注釈、注釈を@RequestMappingによって比較的XXXであり、GET、POST、DELETEのようなのように定義することができます。
  2. 処理方法のパラメータ:①の@ PathVariable:②形態のパスパラメータ、すなわち、URL / {ID}を得る@ RequestParam :?クエリパラメータを取得、すなわちフォームのURL名に=③@ RequestBody:ボディパラメータが渡された場合(典型的にはJSONデータ)は、コメントのオブジェクトをマークする必要がありますし、そのオブジェクトに解析され、割り当てられます。④Formリクエストフォーム:メソッドのパラメータは、別名をマークされていない場合は、メソッドのパラメータの名前と同じでなければなりません、フォームの名前を形成する、または対応する値未満を取得します。

コード例を見てください:

@Controller
public class UserController {

    @Autowired
    private UserService userService;

    @RequestMapping(path = {"register"}, method = {RequestMethod.POST})
    @ResponseBody
    public Map<String, Object> register(String account, String password, String name, String code) {
        Map<String, Object> map = new HashMap<>();

        //判断传入的数据是否为空
       ...
        //判断传入的数据格式是否正确
       ...
        //会话状态的验证
        Session session = SecurityUtils.getSubject().getSession();
       
        try {
            User user = new User();
            user.setAccount(account);
            if (name == null) {
                user.setName(user.getAccount());
            }
            user.setName(name);
            user.setPassword(password);
            user.setRoleId(2);//设置用户角色
            //调用UserService对用户进行注册操作
            userService.register(user);
            map.put("msg", "注册成功");
            return map;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return map;
    }
}
复制代码

上記の方法はPOSTリクエスト形の形態である、それは多くのパラメータを思わ、少し複雑な、そして直接オブジェクトにそれに対処する方法であることを?

    @RequestMapping(path = {"register"}, method = {RequestMethod.POST})
    @ResponseBody
    public Map<String, Object> register(@RequestBody User user) {
        Map<String, Object> map = new HashMap<>();

        //判断传入的数据是否为空
       ...
        //判断传入的数据格式是否正确
       ...
        //会话状态的验证
        ...
    }
复制代码

使用注釈は、JSONデータ形式を返す注釈が使用されていない場合は、その後、該当ページにジャンプ@ResponseBody。

次のように図の要求全体配列は以下のとおりであります:

タイミング図.PNG

おすすめ

転載: juejin.im/post/5d5d3ae26fb9a06b2c329432