SSM(Spring、SpringMVC、MyBatis)
まず、Spring フレームワークと mybatis フレームワークを統合します: (Springmvc フレームワークの統合の次のステップに進む前に、データベースのコンテンツを取得できるかどうかをテストする必要があります。慣れている場合は、log4j ログ テストを試してみることができます。この方法の方が優れています。詳細についてはブログを参照してください:) (36 メッセージ) SSM フレームワーク テンプレート (高度な構成: すべての必要な構成ファイルが一度に構成されます)_one day321 のブログ - CSDNブログ
ディレクトリ構造:
pom.xml ファイルのテンプレート:
最初に行うことは、依存関係パッケージをpom.xml ファイルにインポートすることです。
<?xml version="1.0" encoding="UTF-8"?>
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>SSM_2</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<!-- 单元测试包-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- 最常用的包,这个包包括core,beans,-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.18</version>
</dependency>
<!--Spring-beans包,bean标签-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.3.18</version>
</dependency>
<!--jdbc包,进行数据库操作的包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.18</version>
</dependency>
<!--事务管理包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.3.18</version>
</dependency>
<!--数据库源的包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
<!--进行mybatis操作的包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<!-- mybatis-spring的包,进行整合的包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
</dependencies>
<!-- 这个是IDEA必须存在的,指在用途是告诉IDEA,Mapper.xml文件的位置,因为一般默认情况下IDEA是不会去Java目录的,尽管你添加Java路径都没用-->
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
</project>
applicationContext.xml ファイル テンプレート:
依存パッケージの pom.xml ファイルをインポートした後、applicationContext.xml ファイルを構成してデータベースに接続し、イベントを管理し、Mapper ファイルと mybatis の間のマッピングを構成します。(3 つのステップのうち、マッピングの最後のステップは、mybatis コア構成ファイルとマッパー ファイルを作成した後に構成する必要があります。)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<!--由spring管理 配置数据源数据库连接(从jdbc属性文件中读取参数) -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="url" value="jdbc:mysql://localhost:3307/student?serverTimezone=Asia/Shanghai"/>
<property name="username" value="root"/>
<property name="password" value="dada"/>
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
</bean>
<!-- 整合 mybatis -->
<bean id="sqlSessionFactory"
class="org.mybatis.spring.SqlSessionFactoryBean"
p:dataSource-ref="dataSource"
p:configLocation="classpath:mybatis-config.xml"/>
<!-- mybatis自动扫描 将Mapper接口生成代理注入到Spring -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"
p:sqlSessionFactoryBeanName="sqlSessionFactory"
p:basePackage="dao" />
<!-- 配置事务管理器 完成手动事务管理 由spring管理事务-->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--
支持注解驱动的事务管理,指定事务管理器。
配置事务 提供回滚,发生异常数据回滚 需要在类/方法上写注解 @Transactional -->
<tx:annotation-driven transaction-manager="txManager"/>
<!-- 需要注意,这一句不能遗漏,因为我是在Controller类编写的Test测试,用的注解方法,需要用这个扫描注释注解-->
<context:component-scan base-package="controller"/>
</beans>
applicationContext.xml ファイルを構成した後、最初にこのファイルの 3 番目の手順に従ってマッピングを構成します。mybatis-config.xml ファイル (マッピング Mapper.xml ファイルの場所を指定します。この構成に注意してください。また、以前に pom.xml の bulid タグを構成する必要もあります) と Mapper.xml ファイル (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>
<mappers>
<mapper resource="mybatis/UserMapper.xml"/>
</mappers>
</configuration>
Mapper.xml ファイル: (Java ディレクトリの下の mybatis パッケージに配置されます)
<?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="dao.UserDao">
<select id="queryAll" resultType="po.User" parameterType="po.User">
select *from register
</select>
</mapper>
このマッピング ファイルは私のテストに使用されており、その機能はデータベースのすべての情報をクエリすることです。
テストファイル:
UserTestController.java: (コントローラー層)
package controller;
import dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import po.User;
import java.util.List;
@Controller("userTestImpl")
public class UserTestImpl {
@Autowired
private UserDao userDao;
public void test(){
User user = new User();
List<User> userList = userDao.queryAll(user);
for (int i = 0; i <userList.size() ; i++) {
System.out.println(userList.get(i));
}
}
}
TestUser クラスをテストするには:
package controller;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestUser {
public static void main(String args[]){
ApplicationContext appcon = new ClassPathXmlApplicationContext("applicationContext.xml");
UserTestImpl ut= (UserTestImpl) appcon.getBean("userTestImpl");
ut.test();
}
}
テスト クラスの前に、POJO クラスと dao 層のインターフェイスを記述する必要があることを追加する必要があります。(簡単なので紹介しません。)
最後に、データベースへの接続が成功したことを示すテスト結果が取得されます。次に、そこに SpringMVC フレームワークを書き込んでみることができます。
Springmvc フレームワークを追加します。
SpringMVC フレームワークを追加した後のディレクトリ構造:
pom.xml ファイルに追加する必要がある依存パッケージは次のとおりです。
まず、最初のステップ: pom.xml の依存関係パッケージをインポートします (SpringMVC の依存関係パッケージの場合は、spring-webmvc を追加するだけです。jstl の依存関係パッケージは、JSP の表示ページで jstl タグ メソッドを使用します)。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.18</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
web.xml ファイル: (新しい構成ファイル)
2 番目のステップ: web.xml ファイルを構成します。
<?xml version="1.0" encoding="UTF-8"?>
<web-app
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
id="WebApp_ID" version="4.0">
<!-- 引入Spring 的配置-->
<!-- ContextLoaderListener 需要 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- Bootstraps the root web application context before servlet initialization -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 引入SpringMVC 的配置-->
<!-- 这个Spring Web应用程序的前端控制器(DispatcherServlet),负责
处理所有应用程序请求 -->
<servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 将所有请求映射到 DispatcherServlet 进行处理 -->
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 针对 前端与控制器 数据传递时 的字符过滤器(避免中文乱码) -->
<filter>
<filter-name>encoder</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoder</filter-name>
<servlet-name>springDispatcherServlet</servlet-name>
</filter-mapping>
</web-app>
このファイルを設定するときに、ちょっとした間違いを犯しました。インターネットでテンプレートを探していたのですが、そのテンプレートが次の文にあったからです。
<!-- 処理のためにすべてのリクエストを DispatcherServlet にマッピングします-->
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern> //これがその場所です。私が見つけたテンプレートは *.do です //ブラウザに Index を入力すると、最終的に 404 が / に変更されるはずです。そうすれば問題はありません。
</サーブレットマッピング>
springmvc.xml ファイルテンプレート設定を追加します。
このファイルは、コントローラー層と JSP の間のデータ対話をマップするために使用されます。「ログイン」を返す
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!--视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!--扫包-->
<context:component-scan base-package="controller"/>
</beans>
UserController: (コントロール層と JSP 層間のコード対話)
ステップ 3: 実行コードを作成します。
まず、ビジネス ロジックをコントローラーから分離し、サービス層で表します。(ここではまだテストとしてすべてのデータをクエリする内容を使用しています)
したがって、実際にはサービス層の書き方はdao層と同じになります。スキップするのは比較的簡単です。
主にコントローラー層であるUserControllerを作成します。主に JSP と対話します。
package controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import po.User;
import service.UserService;
import java.util.List;
@Controller
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/queryAll")
public String queryAll(User user, Model model){
List<User> list= userService.queryAll(user);
model.addAttribute("userList",list);
return "show";
}
// 这个是为了方便输入index就显示下面那个index.jsp的页面。
@RequestMapping("/index")
public String index(Model model){
model.addAttribute("user",new User());
return "index";
}
}
JSP 層のコード:
インデックス.jsp:
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form:form modelAttribute="user" method="post" action="${pageContext.request.contextPath}/queryAll">
<input type="submit" value="查看所有信息">
</form:form>
</body>
</html>
show.jsp:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<table>
<tr>
<th>账号</th>
<th>密码</th>
<th>性别</th>
<th>姓名</th>
</tr>
<c:forEach items="${userList}" var="user">
<tr>
<th>${user.account}</th>
<th>${user.password}</th>
<th>${user.sex}</th>
<th>${user.name}</th>
</tr>
</c:forEach>
</table>
</body>
</html>
ここで非常によくある間違いが発生します。
<c:forEach items="${userList}" var="user">
この行では、EL 式 ${} の正しい形式を使用せずに userList を記述しました。その結果として生じる問題は、user.account の使用です。プロンプトは表示されません。
クリックしてプルします:
${userList} このEL式と同様に、コントローラー層のmodel.add("userList", Object )に対応します。
では、必要な EL 式を確実に取得するにはどうすればよいでしょうか。それは主に、どのページが返されるかによって決まります。
最終テスト結果:
完全な SSM フレームワークのテンプレートが完成しました。
将来的には他の機能を追加する必要があるため、変更が必要な箇所を 2 つの部分から変更する必要があります。
パート: 関数を追加するための SQL マッピング (Mapper.xml および mybatis-config.xml)
別の部分: コントローラーと Jsp に対応するマッピングを追加します。
(pom.xml、application、springmvc、web.xml などの構成ファイルは 1 回だけ構成する必要があります)
まずmybatisフレームワークからMapper.xmlのマッピングファイルを変更し、mybatis-config.xmlの仕様を変更します。データが取得できているか再度テストしてみると良いでしょう。
次に、UserController クラスと対応する JSP クラスを SpringMVC フレームワークから追加します。(これら 2 つのデータは相互に反映されるはずなので、注意が必要です。)
ユーザーコントローラークラス:
@RequestMapping("/index") はブラウザの入力ページを指定します。
model.addAttribute("ユーザー",new User());
return "index"; model.addrのデータをindex.jspページに返します。
JSP类(index.jsp、show.jsp):
<form:form modelAttribute="user" は、index.jsp のモデルによって返されるデータに対応します。
action="${pageContext.request.contextPath}/queryAll"> は、queryALL のコントローラーの @RequestMapping("/queryAll") メソッドに対応します。
<c:forEach items="${userList}" var="user"> 同様に、queryAllに対応するメソッド内のモデルデータuserList
最後に、実践を通じて、Controll 層に加えて、戻って JSP データを操作したり、サービス層で JSP データを操作したりできることがわかりました。サービス層がビジネス ロジックを担当するためです。したがって、データが JSP から取得された場合は、まずコントローラー層に送信され、次にコントローラー層がデータ対話のためにサービス層に送信されます。
要約:(違いに注意する必要があります)
前の例と同様に、すべてのユーザー情報をクエリするには、データベース内からすべての情報を取得します。したがって、データは dao 層から取得され、サービスに渡され、さらにコントローラー層に渡されます。最後に、表示のために JSP 層に渡されます。
このようにして、コントローラーは JSP 層にデータを提供し、model.addrute を通じて JSP にデータを提供します。
ただし、オンデマンドでそのようなフォーム情報にログインしたりクエリしたりする場合は、JSP からデータを取得してコントローラーに送信し、コントローラーはそのデータをクエリのためにサービスに渡し、最後にサービス層が結果を表示のために JSP 層に返します。(よくある使い方です。ログインして練習してください)
このように、JSP は form:action="${pagecontext/request/contextPath}/特定のコントローラーの @RequestMapping の名前" を通じてコントローラー層にデータを提供します。このメソッドは、コントローラー層にデータを提供します。
このように、コントローラー層は、model.addrbut() の方法でデータを返す必要がありません。つまり、JSP によって提供されるデータにはデータ バインディングが必要ありません。サービス層に直接戻り、サービス層はデータを JSP 層に提供します。