Java后台应用项目开发 Part 2 - MVC模式开发与 SpringMVC 框架开发
【版本】
当前版本号v20210922
版本 | 修改说明 |
---|---|
v20210922 | 补充Maven打包相关步骤 |
v20210913 | 初始化版本 |
【实验名称】 实验2.1 MVC模式模拟开发登录功能
【实验目的】
- 掌握 MVC 模式的开发代码。
- 掌握 JUnit 测试用例的编写。
【实验环境】
- 内存:至少4G
- 硬盘:至少空余10G
- 操作系统: 64位 Windows系统。
【实验资源】
- IDEA
- Maven 3.6
【实验要求】
根据以下提示,编写一个使用 MVC 模式模拟用户登录的例子,请完成 Maven 项目的新建、并完善代码。
运行
LoginTest
的testLoginController
方法,能够输出成功登录的页面 HTML 内容。运行
LoginTest
的testLoginService
方法,测试用例能够通过。
- 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开发项目】
新建 Maven 项目,archetype 选择
webapp
。选择项目路径
选择 Maven 的安装目录,settings.xml的路径和 Maven 本地仓库的路径。
【实验提示——登录流程和代码提示】
登录流程。
UserEntity
主要包括用户名和密码,可以编写为一个POJO。
public class UserEntity {
//请完善代码
}
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);
}
}
- 编写
LoginDao
,实现validUserPwd
方法,校验用户名和密码。
public class LoginDao {
/**
* 返回 true 表示密码验证正确,返回false表示验证失败
* @param username 用户发送用户名
* @param pwd用户发送密码
* @return
*/
public boolean validUserPwd(String username,String pwd){
//请完善代码
}
}
- 编写
LoginService
,实现 validUserPwd 方法,校验用户名和密码。
public class LoginService {
private LoginDao loginDao=new LoginDao();
/**
* 验证用户名和密码
* @param ue 用户提交用户名和密码
* @return
*/
public boolean validUserPwd(UserEntity ue){
//请完善代码,考虑直接调用loginDao
}
}
- 编写
LoginModel
,用于装载登录结果的消息。成功显示“登录成功”;失败显示“用户名或密码错误”。写成一个简单的POJO。
public class LoginModel {
private String msg;
//请完善代码
}
- 编写
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>
- 编写
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){
//请完善代码,返回页面内容
}
}
【实验名称】 实验2.2 使用 SpringMVC 开发登录功能
【实验目的】
- 掌握 SpringMVC 的配置
- 掌握 SpringMVC 的开发
【实验环境】
- 内存:至少4G
- 硬盘:至少空余10G
- 操作系统: 64位 Windows系统。
【实验资源】
- IDEA
- Maven 3.6
【实验要求】
根据实验2.1提供的步骤新建一个新的 Maven Web 开发项目。
根据项目结构和提示的代码,使用 SpringMVC 开发完成登录功能。
完成代码的编写以后,遵循以下步骤构建项目。打开运行配置窗口。
新增 Maven 打包命令
build-war
。其中 Command Line: 输入的内容,分别表示
- clean 清理构建文件夹
- compile 编译代码
- war:war 表示构建 war 包。
clean compile war:war
运行
build-war
命令,开始构建 war 包。运行
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();
}
}