最近在学习springmvc框架,每天的学习过程中颇有一些收获,打算写一篇博客记录一下,也希望能帮到同样在学这个的人。
(1)前端控制器(DispatcherServlet):用于接受用户请求;
(2)处理器映射器(HandleMapping):根据URL去查找处理器,在代码中用Controller来表示处理器的相关代码实现;
(3)处理器(Handle或者Controller):需要程序员来写处理逻辑;
(4)处理器适配器(HandleAdapter):把处理器包装成适配器,这样可以支持多种处理器使用;
(5)视图解析器(ViewResovler):进行视图解析,返回对应的页面;
(1)用户向前端控制器发送请求,前端控制器转而请求处理器映射器去查找合适的处理器,查找的方式是通过xml配置文件或者注解;
(2)当处理器映射器找到合适的处理器之后,会向前端控制器返回一个执行链;
(3)前端控制器再通过返回的执行链去调用处理器适配器来执行对于的处理器;
(4)处理器执行完会给处理器适配器返回一个ModelAndView,处理器适配器再将这个ModelAndView返回给前端控制器;
(5)前端控制器拿到之后再去请求视图解析器进行解析,视图解析器解析之后再向前端控制器返回View;前端控制器将返回的View进行渲染之后,将结果展现给用户。
在做这个项目之前请先在电脑里安装好mysql和tomcat,我用的开发工具是IDEA。先来一张整个项目的结构图,对于新手而言能有一张项目结构图帮助理解是顶好的:
在idea里新建一个maven工程(maven工程的创建网上有很多教程,这里不加赘述),工程名称叫做SBlog,因为我这个工程最终是为了实现个人博客,所以不要纠结工程名字。
1:在SBlog/src/main下创建java文件夹,右键Mark Directory as,选择Test Sources root;只有这样才能在java文件夹下创建包。然后在java文件夹下创建example包,在example包下再分别创建controller,dao,pojo,service四个包。在webapp/WEB-INF下创建view文件夹。
在springmvc工程中,每一个包都有不同的作用:
(1)controller包是用来存放前后端控制的java代码;
(2)dao包是用来存放与数据库相关的java代码;
(3)pojo包使用来存放各种been的;
(4)service包是存放与服务器相关的java代码;
(5)view下的.jsp文件是前端页面显示内容的配置文件;
2:修改pom.xml文件,引入本工程需要的依赖包;
4.0.0
com.yxy.BLOG
SBlog
war
1.0-SNAPSHOT
SBlog Maven Webapp
http://maven.apache.org
UTF-8
UTF-8
true
1.8
1.8
junit
junit
4.12
test
junit
junit
RELEASE
org.junit.jupiter
junit-jupiter-api
RELEASE
com.alibaba
fastjson
1.1.41
log4j
log4j
1.2.17
org.slf4j
slf4j-api
1.7.21
org.slf4j
slf4j-log4j12
1.7.21
org.springframework
spring-core
4.3.2.RELEASE
org.springframework
spring-web
4.3.2.RELEASE
org.springframework
spring-oxm
4.3.2.RELEASE
org.springframework
spring-tx
4.3.2.RELEASE
org.springframework
spring-jdbc
4.3.2.RELEASE
org.springframework
spring-webmvc
4.3.2.RELEASE
org.springframework
spring-context
4.3.2.RELEASE
org.springframework
spring-context-support
4.3.2.RELEASE
org.springframework
spring-aop
4.3.2.RELEASE
org.springframework
spring-test
4.3.2.RELEASE
javax.servlet
javax.servlet-api
4.0.0
provided
javax.servlet.jsp
jsp-api
2.2
javax.servlet
jstl
1.1.1
org.mybatis
mybatis
3.4.5
org.mybatis
mybatis-spring
1.3.0
mysql
mysql-connector-java
5.1.38
commons-dbcp
commons-dbcp
1.2.2
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
org.apache.commons
commons-lang3
3.4
commons-codec
commons-codec
1.9
org.aspectj
aspectjrt
1.8.6
SBlog
org.mybatis.generator
mybatis-generator-maven-plugin
1.3.2
true
true
maven-compiler-plugin
1.8
UTF-8
maven-resources-plugin
2.6
ISO-8859-1
引入之后会自动开始下载。
3:在mysql里创建user表和usertwo表,然后插入几条数据
4:在pojo包下新建User.java和Usertwo.java文件。注意这里这两个文件的名称最好与你所要查询的数据库表的名称相统一,结构上会更加清晰。
package example.pojo;
public class User {
//获取登陆账号密码的been;
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
package example.pojo;
public class Usertwo {
private Integer id;
private String name;
private String address;
public Usertwo(){}
public Usertwo(Integer id, String name, String address) {
this.id = id;
this.name = name;
this.address = address;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", address='" + address + '\'' +
'}';
}
}
5:在dao包下建立访问底层数据的接口UserDao
package example.dao;
import example.pojo.User;
import example.pojo.Usertwo;
import java.util.List;
public interface UserDao {
List getAllUsers();
//这里以接口形式定义了数据库操作方法,我们只需在Mybatis映射文件中对其进行映射就可以直接使用
public User selectByName(String username);
}
6:配置mysql数据库的连接信息,以便于可以找到本地的数据库位置;
在mybatis目录下新建mysql.properties文件:
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/数据库的名称
username=root
password=root
7:配置与UserDao对应的Mapper.xml文件,新建文件mybatis/mapping/UserDaoMapper.xml
8:在resources下创建mybatis包,然后新建mybatis.xml文件,用了实现Mybatis与mysql的连接
9:配置log4j文件,用于在本地输出日志,新建文件resources/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 = F:/Java Bian Chen/log/log.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
10:实现spring和mybatis的配置,在resources下新建spring包,在spring目录下新建spring-mybatis.xml文件;
classpath:mybatis/mysql.properties
${driver}
${url}
${username}
${password}
11:配置springmvc文件,在spring目录下新建spring-mvc.xml文件;
12:配置大管家web.xml文件;
index.jsp
contextConfigLocation
classpath:spring/spring-mybatis.xml
characterEncodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
forceEncoding
true
characterEncodingFilter
/*
log4jConfigLocation
classpath:log4j.properties
org.springframework.web.context.ContextLoaderListener
springMVC
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:spring/spring-mvc.xml
1
true
springMVC
/
13:接下来就是编辑页面的显示内容了,这需要在.jsp文件里进行操作;
(1)首先更改index.jsp文件的内容,它是工程默认的登陆页面;
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
(2)在WEB-INF/view/目录下添加文件page1.jsp展示从数据库获取的usertwo数据信息;
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
Hello world!
${user.id}
${user.name}
(3)在WEB-INF/view/目录下添加文件dlcg.jsp和dlsb.jsp文件,这两个文件对应登陆成功和登录失败两个界面;
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
登入成功!
您好!${user.username}
返回
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
登入失败!
${message}
返回
14:然后是控制层的代码编写,这里面要实现我们从前端获取输入信息与数据库比对已经从数据库获取信息并显示在前端的方法;在controller包下新建UserController.java
package example.controller;
import example.pojo.User;
import example.pojo.Usertwo;
import example.service.UserService;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
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 javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
//@Controller注解用于标示本类为web层控制组件
@Controller
//@RequestMapping("/user")用于标定访问时对url位置
@RequestMapping("/user")
//在默认情况下springmvc的实例都是单例模式,所以使用scope域将其注解为每次都创建一个新的实例
@Scope("prototype")
public class UserController {
private static final Logger logger = Logger.getLogger(UserController.class);
@Resource
private UserService service;
/**
*返回user对象信息给page1.jsp处理,然后在前端页面展示
*/
@RequestMapping("/page")
public ModelAndView getUser() {
System.out.println("访问page1的后台。。。");
ModelAndView mav = new ModelAndView("page1");
List users = service.getAllUser();
System.out.println(users);
mav.addObject("user", users.get(0));
return mav;
// return "page1"; //跳转到.jsp结尾的对应文件(page1.jsp),此时返回值是String
}
/**
* 直接返回字符串给请求的页面(这里在请求URL增加参数v是验证前后台通信是否正常)
* @param request
* @param response
* @return
*/
@RequestMapping(value = "/sql", produces = "text/html;charset=UTF-8")
@ResponseBody
public String sayHi(HttpServletRequest request, HttpServletResponse response) {
String name = request.getParameter("v");
List users = service.getAllUser();
logger.info("{name:yxy,context:hi,你好}");
return name+"-{name:yxy,context:hi,你好}"+users;
}
//自动注入业务层的userService类
@Autowired
UserService userService;
//login业务的访问位置为/user/login
@RequestMapping("/login")
public String login(User user,HttpServletRequest request){
//调用login方法来验证是否是注册用户
boolean loginType = userService.login(user.getUsername(),user.getPassword());
if(loginType){
//如果验证通过,则将用户信息传到前台
request.setAttribute("user",user);
//并跳转到success.jsp页面
return "dlcg";
}else{
//若不对,则将错误信息显示到错误页面
request.setAttribute("message","用户名密码错误");
return "dlsb";
}
}
}
15:最后是服务层的代码编写,在service包下分别创建UserService和UserServiceImpl文件;
package example.service;
import example.pojo.User;
import example.pojo.Usertwo;
import java.util.List;
public interface UserService {
List getAllUser();
public boolean login(String username, String password);
}
这里定义了一个UserService接口,里面需要实现两个方法来获取数据库的信息;
package example.service;
import example.dao.UserDao;
import example.pojo.User;
import example.pojo.Usertwo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
@Service("userServiceImpl")
@Scope("prototype")
public class UserServiceImpl implements UserService {
@Resource
private UserDao userDao;
@Override
public List getAllUser() {
return userDao.getAllUsers();
}
//下面是实现登陆的服务层代码;
//自动注入iuserdao 用于访问数据库
@Autowired
UserDao Mapper;
//登录方法的实现,从jsp页面获取username与password
public boolean login(String username, String password) {
User user = Mapper.selectByName(username);
if (user != null) {
if (user.getUsername().equals(username) && user.getPassword().equals(password))
return true;
}
return false;
}
}
至此,代码工作就完成了,下面是测试的方法以及测试的结果展示;
使用Tomcat9作为服务器,将WEB工程发布到Tomcat上并进行测试。
服务器启动进入登陆界面:
输入用户名为:yxy,密码为:123456,点击登陆跳转页面到
当输入用户名和密码与数据库总保存的不一致时,页面跳转到
当输入地址:http://localhost:8080/user/sql后,会调取数据库中usertwo表的数据并显示到页面;
本文介绍的主要是springmvc框架的搭建以及和mysql数据库的连接调用方法,也是在这段时间开始学习框架以来的一次总结。网上类似讲解springmvc的文章有很多,而且我在代码里该标注的地方也标注出来了,所以文中讲解的东西并不多。在配置的过程中学习到了很多东西,这些东西只有当自己亲手去搭建时才能领会。希望能帮到一些和我一样的初学者更快的掌握这个框架,实现想要实现的功能。