Part 3 - MVC模式开发与 SpringMVC 框架开发

2021-09-13
5分钟阅读时长

【版本】

当前版本号v20210922

版本修改说明
v20210922补充Maven打包相关步骤
v20210913初始化版本

【实验名称】 实验3.1 MVC模式模拟开发登录功能

【实验目的】

  • 掌握 MVC 模式的开发代码。
  • 掌握 JUnit 测试用例的编写。

【实验环境】

  • 内存:至少4G
  • 硬盘:至少空余10G
  • 操作系统: 64位 Windows系统。

【实验资源】

  • IDEA
  • Maven 3.6

【实验要求】

  1. 根据以下提示,编写一个使用 MVC 模式模拟用户登录的例子,请完成 Maven 项目的新建、并完善代码。

  2. 运行LoginTesttestLoginController方法,能够输出成功登录的页面 HTML 内容。

  3. 运行LoginTesttestLoginService方法,测试用例能够通过。

  • LoginTest 的代码
import org.junit.Test;
import static org.junit.Assert.assertTrue;

public class LoginTest {

    @Test
    public void testLoginController(){
        LoginController controller=new LoginController();
        System.out.println(controller.login("zhangsan","123456"));
    }

    @Test
    public void testLoginService(){
        LoginService service=new LoginService();
        UserEntity ue=new UserEntity();
        ue.setUsername("zhangsan");
        ue.setPassword("123456");
        assertTrue(service.validUserPwd(ue));
    }
}

【实验提示——如何新建 Maven Web开发项目】

  1. 新建 Maven 项目,archetype 选择 webapp

  2. 选择项目路径

  3. 选择 Maven 的安装目录,settings.xml的路径和 Maven 本地仓库的路径。

【实验提示——登录流程和代码提示】

  1. 登录流程。

  2. UserEntity主要包括用户名和密码,可以编写为一个POJO。

public class UserEntity {
  //请完善代码
}
  1. DB主要模拟数据库,装载了用户名和密码。
public class DB {
    public static final Map<String,UserEntity> USERS=new HashMap<>();
    static{
        UserEntity ue=new UserEntity();
        ue.setUsername("zhangsan");
        ue.setPassword("123456");
        //在数据库保存用户名和密码
        USERS.put(ue.getUsername(),ue);
    }
}
  1. 编写 LoginDao,实现validUserPwd方法,校验用户名和密码。
public class LoginDao {
    /**
     * 返回 true 表示密码验证正确,返回false表示验证失败
     * @param username 用户发送用户名
     * @param pwd用户发送密码
     * @return
     */
    public boolean validUserPwd(String username,String pwd){
      //请完善代码
    }
}
  1. 编写LoginService,实现 validUserPwd 方法,校验用户名和密码。
public class LoginService {
    private LoginDao loginDao=new LoginDao();

    /**
     * 验证用户名和密码
     * @param ue 用户提交用户名和密码
     * @return
     */
    public boolean validUserPwd(UserEntity ue){
        //请完善代码,考虑直接调用loginDao
    }
}
  1. 编写LoginModel,用于装载登录结果的消息。成功显示“登录成功”;失败显示“用户名或密码错误”。写成一个简单的POJO。
public class LoginModel {
    private String msg;
    //请完善代码
}

  1. 编写LoginView,用于根据传入的LoginModel返回页面内容。
public class LoginView {
  /**
   * 返回页面内容
   * @param model
   * @return
   */
    public String render(LoginModel model){
      //请完善代码,返回页面内容。
    }
}
  • 如果成功,返回以下页面。失败显示“用户名或密码错误”。
<!DOCTYPE html>
<html>
  <head>
    <title>登录成功</title>
  </head>
  <body>
    <p>登录成功</p>
  </body>
</html>
  1. 编写LoginController,接受用户提交的用户名和密码,根据校验结果返回不同的页面。
public class LoginController {
    private LoginService loginService=new LoginService();
    private LoginView loginView=new LoginView();
    /**
     * 返回页面内容
     * @param username 用户请求用户名
     * @param pwd 用户请求密码
     * @return
     */
    public String login(String username,String pwd){
      //请完善代码,返回页面内容
    }
}

【实验名称】 实验3.2 使用 SpringMVC 开发登录功能

【实验目的】

  • 掌握 SpringMVC 的配置
  • 掌握 SpringMVC 的开发

【实验环境】

  • 内存:至少4G
  • 硬盘:至少空余10G
  • 操作系统: 64位 Windows系统。

【实验资源】

  • IDEA
  • Maven 3.6

【实验要求】

  1. 根据实验3.1提供的步骤新建一个新的 Maven Web 开发项目。

  2. 根据项目结构和提示的代码,使用 SpringMVC 开发完成登录功能。

  3. 完成代码的编写以后,遵循以下步骤构建项目。打开运行配置窗口。

  4. 新增 Maven 打包命令build-war。其中 Command Line: 输入的内容,分别表示

  • clean 清理构建文件夹
  • compile 编译代码
  • war:war 表示构建 war 包。
clean compile war:war

  1. 运行build-war命令,开始构建 war 包。

  2. 运行Application 类的main方法,访问 http://localhost:8082/login ,使用用户名zhangsan和密码123456登录并返回登录成功页面。

【实验提示——部分代码】

  • 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>javaweb-exe02-springmvc</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <spring.version>5.0.5.RELEASE</spring.version>
        <tomcat.embed.version>8.0.28</tomcat.embed.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-servlet-api</artifactId>
            <version>${tomcat.embed.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-jsp-api</artifactId>
            <version>${tomcat.embed.version}</version>
        </dependency>

        <!-- 嵌入式tomcat依赖 -->
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-core</artifactId>
            <version>${tomcat.embed.version}</version>
        </dependency>

        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
            <version>${tomcat.embed.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-logging-juli</artifactId>
            <version>${tomcat.embed.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.9</version>
        </dependency>
    </dependencies>
    <build>
        <finalName>mobileshop</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                    <url>http://localhost:8080/manager/text</url>
                    <username>admin</username>
                    <password>password</password>
                    <path>/mobileshop</path>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.5.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                    <!-- 指定编码格式,否则在DOS下运行mvn compile命令时会出现莫名的错误,因为系统默认使用GBK编码 -->
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <version>2.6</version>
                <configuration>
                    <encoding>UTF-8</encoding>
                    <!-- 指定编码格式,否则在DOS下运行mvn命令时当发生文件资源copy时将使用系统默认使用GBK编码 -->
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
  • web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <display-name>MobileShop</display-name>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
    </welcome-file-list>
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>
            org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <!-- 指定Spring的配置文件 -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-mvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    <!-- 允许访问以html、css、js为结尾的静态资源 -->
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.html</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.css</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.js</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.jpg</url-pattern>
    </servlet-mapping>
    <!-- 解决中文乱码问题 -->
    <filter>
        <filter-name>Set Character Encoding</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>Set Character Encoding</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>
  • spring-mvc.xml
<?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:context="http://www.springframework.org/schema/context"
        xmlns:mvc="http://www.springframework.org/schema/mvc"
        xsi:schemaLocation="
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
		http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">
    <!--配置注解扫描-->
    <context:component-scan base-package="mobileshop.controller"/>
    <!-- SpringMVC注解支持 -->
    <mvc:annotation-driven/>

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/html/" />
        <property name="suffix" value=".html" />
    </bean>
</beans>
  • login.html
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>登录</title>
	</head>
	<body>
		<!-- <form action="checkLogin.do"> -->
		<form action="signin">
			用户名:<input type="text" name="username"/>
			密码:<input type="password" name="password"/>
			<input type="submit" value="登录">
		</form>
	</body>
</html>
  • index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>主页</title>
</head>
<body>
<h2>登录成功,欢迎进入主页</h2>
</body>
</html>
  • error.html
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>error</title>
	</head>
	<body>
		<h2>登录失败,用户名或密码错误</h2>
		<a href="/login" target="_self">返回登录页</a>
	</body>
</html>
  • Application.java
package mobileshop;

import org.apache.catalina.startup.Tomcat;
import org.apache.commons.lang3.StringUtils;

import java.io.File;
import java.net.URL;
import java.util.Properties;

public class Application {
    private int port = 8082;
    private String contextPath = "/";
    public void start() throws Exception {
        Tomcat tomcat = new Tomcat();
        URL url = getClass().getClassLoader().getResource("spring-mvc.xml");
        System.out.println("URL path:"+url.getPath());
        String pwd = StringUtils.substringBefore(url.getPath(), "/target/classes");
        System.out.println("BaseDir:"+pwd);
        tomcat.setBaseDir(pwd);
        tomcat.setPort(port);

        StringBuilder webAppBuilder = new StringBuilder();
        webAppBuilder.append(pwd).append(File.separator).append("target/mobileshop");
        String webapp = webAppBuilder.toString();

        tomcat.addWebapp(contextPath, webapp);
        tomcat.enableNaming();
        tomcat.start();
        tomcat.getServer().await();
    }

    public static void main(String[] args) throws Exception {
        Application starter = new Application();
        starter.start();
    }
}

扫码或长按识别访问