首先springmvc的基础架构,需要单独详细解释。可以参考下面这篇文章,也可以在B站上找找黑马的培训视频,讲解的很详细。
https://www.cnblogs.com/xiaoxi/p/6164383.html
需求背景:
要设计一个项目,当用户登陆首页的时候,提示让你输入用户名和密码,输入正确,则跳转页面,显示你的序号和姓名。输入错误,则提示密码错误,重新输入。
判断用户名密码正确与否,是根据已经存在数据库中的表的数据,如果输入的数据存在表中,即正确,否则错误。
这里讲一下如何本人的开发环境:
jdk: 1.8.0_191
开发工具:Mac Idea
Tomcat: 9.0.12
其实开发环境无所谓,只要各个开发版本的新旧差异不是特别大,就行。别一个三四年前的版本,一个最新版,这中情况会出现一些未知的错误。
首先新建一个maven项目,直接一步步的next就行了。然后新建一些文件目录,把工程结构设计好,设计如下。
其中有几个暂时没用,为了以后设计的。主要是:
controller层,mapper层,pojo层,service层和view层
接下来把所有文件的具体代码列出来。按照我个人的理解,依次介绍:
主要是把实体抽象出来,有人也给叫做实体层Entity
只定义一个User类,这个用户必须有序号,姓名,密码和年龄这几项,都是需求需要的。
package com.lijuntao.springmvc.pojo;
import javax.persistence.Entity;
@Entity
public class User {
private int id;
private String name;
private String password;
private int age;
//如果没有无参构造器,则报错,无法装载pojo
public User() {
// TODO Auto-generated constructor stub
}
public int getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password == null ? null : password.trim();
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public User(String username, String password, int age) {
super();
this.name = username;
this.password = password;
this.age = age;
}
@Override
public String toString() {
return "User [id=" + id + ", userName=" + name + ", password="
+ password + ", age=" + age + "]";
}
}
有的文章也把它叫做DAO层,用来持久化数据,主要是先定义一个用户的DAO层接口,再把它实现。
DAO层接口:UserMapper
package com.lijuntao.springmvc.mapper;
import com.lijuntao.springmvc.pojo.User;
import org.apache.ibatis.annotations.Param;
import javax.persistence.Entity;
@Entity
public interface UserMapper {
//重点说明,这里一定要有@Param("name"),因为这样,在xml文件中查询数据库的时候,才能找到这个条件
User findUser(@Param("name") String name,@Param("password") String password);
User getUserById(int id);
}
DAO层接口的实现:UserMapperImpl
package com.lijuntao.springmvc.mapper.impl;
import com.lijuntao.springmvc.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import com.lijuntao.springmvc.mapper.UserMapper;
public class UserMapperImpl implements UserMapper{
//一定要有@Autowired,注解开发,这样后面的handler适配器才能找到对应的mapper
@Autowired
UserMapper userMapper;
public User findUser(String name,String password){
return userMapper.findUser(name, password);
}
public User getUserById(int id){
return userMapper.getUserById(id);
}
}
UserMapper对应的xml文件是UserMapper.xml文件,主要是把数据库中查到的数据注入到DAO层
UserMapper.xml
主要是UserService及其实现,用来进行业务逻辑的处理。
UserService:
package com.lijuntao.springmvc.service;
import com.lijuntao.springmvc.pojo.User;
import org.springframework.transaction.annotation.Transactional;
@Transactional
public interface UserService {
/**
* @param name
* @param password
* @return
*/
User findUser(String name, String password) ;
User getUserById(int id);
}
UserServiceImpl:
package com.lijuntao.springmvc.service.impl;
import com.lijuntao.springmvc.mapper.UserMapper;
import com.lijuntao.springmvc.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import com.lijuntao.springmvc.service.UserService;
import org.springframework.stereotype.Service;
/**
*
*/
@Service
public class UserServiceImpl implements UserService{
@Autowired
private UserMapper usi;
public User findUser(String name, String password) {
boolean flag = checkString(name,1,10)&&checkString(password,1,10);
if (!flag)
return null;
return usi.findUser(name,password);
}
private boolean checkString(String str,int minL,int maxL){
return str!=null&&str.length()>=minL&&str.length()<=maxL;
}
public User getUserById(int id) {
// TODO Auto-generated method stub
return usi.getUserById(id);
}
}
主要是如何拦截到URL后,如何执行操作
IndexController,表示拦截到首页的URL时,返回index.jsp页面上。
package com.lijuntao.springmvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/")
public class IndexController {
@RequestMapping
public String index() {
return "index";
}
}
UserLogin:因为首页就提示要进行密码验证登录,所以当提交登录操作时,如何处理,这个controller说明了。
package com.lijuntao.springmvc.controller;
import com.lijuntao.springmvc.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import com.lijuntao.springmvc.service.UserService;
@Controller
@RequestMapping("/user")
public class UserLogin {
@Autowired
UserService userService;
@RequestMapping("/login")
@ResponseBody
public ModelAndView login(String name, String password){
//String uname = request.getParameter("name");
//String upassword = request.getParameter("password");
//用两种方式都行
ModelAndView modelAndView;
try {
//先判断用户名是否为空,是否符合定义的长度、大小写规则
//如果符合规则,就finduser
User user = userService.findUser(name,password);
//System.out.println("------------------" + user.getId());
//System.out.println("------------------" + user.getName());
//如果 user.getId()=0
if(user!=null){
modelAndView = new ModelAndView("hello");
modelAndView.addObject("info","密码正确");
modelAndView.addObject("id",user.getId());
modelAndView.addObject("name",user.getName());
}else {
modelAndView = new ModelAndView("login");
}
} catch (Exception e) {
e.printStackTrace();
modelAndView = new ModelAndView("login");
modelAndView.addObject("info","您的账号或密码错误,请输入正确的账号和密码");
}
return modelAndView;
}
}
这里面有三个页面,index表示首页,hello表示登录成功,login表示还需要再重新登录
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
主页
请先登录
hello.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
欢迎${name}
${info}
id
name
${id}
${name}
login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
登录
密码错误,请重新登录
1. 首先是maven的pom.xml文件,其实网上随便找一下都是这个文件,缺什么补什么即可
4.0.0
war
springmvc
com.lijuntao
springmvc
1.0-SNAPSHOT
org.mortbay.jetty
maven-jetty-plugin
6.1.5
src/main/webapp
3
/study-web
8088
UTF-8
UTF-8
4.2.3.RELEASE
3.2.8
5.1.29
1.7.18
1.2.17
1.8
1.8
http://maven.apache.org
junit
junit
4.8.2
javax
javaee-api
8.0
provided
javax.servlet
javax.servlet-api
4.0.1
provided
org.springframework
spring-core
4.2.3.RELEASE
org.springframework
spring-beans
4.2.2.RELEASE
org.springframework
spring-context
4.2.2.RELEASE
org.springframework
spring-tx
4.1.9.RELEASE
org.springframework
spring-aspects
4.2.1.RELEASE
org.springframework
spring-context-support
${spring.version}
org.springframework
spring-jdbc
4.2.3.release
org.springframework
spring-test
4.1.9.RELEASE
org.springframework
spring-web
4.2.3.RELEASE
org.springframework
spring-webmvc
4.1.9.RELEASE
org.mybatis
mybatis
3.2.2
org.mybatis
mybatis-spring
1.3.0
org.javassist
javassist
3.17.1-GA
cglib
cglib
2.2.2
c3p0
c3p0
0.9.1.2
taglibs
standard
1.1.2
javax.servlet
jstl
1.2
com.oracle
ojdbc6
11.2.0.3
test
mysql
mysql-connector-java
8.0.12
org.springframework.security
spring-security-config
3.1.4.RELEASE
org.springframework
spring-oxm
${spring.version}
org.springframework
spring-aop
${spring.version}
commons-dbcp
commons-dbcp
1.2.2
com.alibaba
fastjson
1.1.41
log4j
log4j
${log4j.version}
org.slf4j
slf4j-api
${slf4j.version}
org.slf4j
slf4j-log4j12
${slf4j.version}
org.codehaus.jackson
jackson-mapper-asl
1.9.13
com.fasterxml.jackson.core
jackson-core
2.8.0
com.fasterxml.jackson.core
jackson-databind
2.8.0
commons-fileupload
commons-fileupload
1.3.1
commons-io
commons-io
2.4
commons-codec
commons-codec
1.9
2. web.xml (重点,重中之重)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Archetype Created Web Application
log4jConfigLocation
classpath:log4j.properties
rootLevel
DEBUG
loggingLevel
INFO
org.springframework.web.util.Log4jConfigListener
encodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
encodingFilter
/*
org.springframework.web.context.ContextLoaderListener
contextConfigLocation
classpath:applicationContext.xml
org.springframework.web.util.IntrospectorCleanupListener
SpringMVC
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:spring-mvc.xml
1
true
SpringMVC
/
/
15
3. applicationContext.xml
4. spring-mvc.xml
text/html;charset=UTF-8
5. log4j.xml
6. mybatis-config.xml 是关于mybatis的配置,主要因为是以前手动配置时需要,现在自动扫描不需要了,所以加进来只是防止缺文件报错,其实没有使用。
1.jdbc.properties
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/springmvc
username=root
password=admin123
#定义初始连接数
initialSize=0
#定义最大连接数
maxActive=20
#定义最大空闲
maxIdle=20
#定义最小空闲
minIdle=1
#定义最长等待时间
maxWait=60000
2.log4j.properties
#定义LOG输出级别
log4j.rootLogger=INFO,Console,File
#定义日志输出目的地为控制台
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.Target=System.out
#可以灵活地指定日志输出格式,下面一行是指定具体的格式
log4j.appender.Console.layout = org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=[%c] - %m%n
#文件大小到达指定尺寸的时候产生一个新的文件
log4j.appender.File = org.apache.log4j.RollingFileAppender
#指定输出目录
log4j.appender.File.File =logs/ssm.log
#定义文件最大大小
log4j.appender.File.MaxFileSize = 10MB
# 输出所以日志,如果换成DEBUG表示输出DEBUG以上级别日志
log4j.appender.File.Threshold = ALL
log4j.appender.File.layout = org.apache.log4j.PatternLayout
log4j.appender.File.layout.ConversionPattern =[%p] [%d{yyyy-MM-dd HH\:mm\:ss}][%c]%m%n
CREATE TABLE `user_t` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(40) DEFAULT NULL,
`password` varchar(255) NOT NULL,
`age` int(4) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
致此,以上必须的文件都已经备齐了,目录里面还有一些没有介绍的,是本文里面没有使用的。不需要介绍。直接利用maven进行install,生成war包,发布到tomcat,就可以访问了
首页:localhost:8080
重新登录页:localhost:8080/user/login
登录成功hello页:也是localhost:8080/user/login,只是页面上返回的信息不一样而已。