自动上期所服务器开发,本地服务器的搭建和前后端打通(一)

15年进入大学,虽然不敢说什么一眼万年,但是我转眼也有三年多了。目前正在实习中。毕设题目已经选好。选了我的数据库老师(本来是不打算涉及到后台部分的,只是打算前端显示的炫酷一些,因为想法中都是使用网上的公开 API 实现)

老师和我说到时候会问数据库的问题,所以一定要有工作量,再加上我一直有些后悔大学上课没有好好学习后台开发,当然学校的知识你们都懂的。所以正好逼自己一下,比较彻底的了解后台的基本开发和入门。

这里我要很感谢一个为了爱从宁波跑到广西的老哥,他在我学习中给予了非常大的帮助,每次我问他问题都会耐心的解答。

话不多说,先介绍一下我的环境:

window 10

Idea 2018

tomcat 7,8 都有使用(我装了两个)

AndroidStudio 3.2.1

gradle 4.6

maven 负责 jar 包管理

后台使用框架技术:SSM,App 端请求:RxJava + Retrofit 实现简单网络的访问。

一:后台的搭建

1)新建 maven 项目

这里大家可以有两个选择,一个是新建 maven 空项目,一个是新建 maven web 项目都可以。不过我好像看过一篇文章说新建 maven 空项目的好处,不过不管了,这里我使用的是 新建 maven web 项目。

5d1fe5b24993

sx01.png

字写的比较丑,,,见谅,接下来点击 next

5d1fe5b24993

xs02.png

这里的名字随便写,没什么影响,点击 next

5d1fe5b24993

xs3.png

因为我单独装过 maven 3.6 版本,这样会便于管理,因为路径和配置什么的方便查找,如果你是用第二个也没啥关系,那是系统自带的,其实对于一般使用来说没什么区别。

点击 next

5d1fe5b24993

xs04.png

这里点击 auto-import 即可。其他的一些基础系统会自动帮你配置,你只需要等待就 ok 了。

5d1fe5b24993

xs05.png

当看到出现这几个打字,尤其是 finish 之后就说明基本项目新建好了。接下来就是配置 SSM 了。

下面我会列出我的配置信息

5d1fe5b24993

xs06.png

这是项目刚新建好的目录结构

5d1fe5b24993

xs07.png

这是项目搭建完成后的目录,下面是配置信息。

大家新建项目的时候可以按照这个来操作

5d1fe5b24993

sx08.png

不同的资源文件夹有不同的颜色,大家对号入座就行

pom.xml 文件

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

4.0.0

com.jiwenjie

Gratuation_example

1.0-SNAPSHOT

war

Gratuation_example Maven Webapp

http://www.example.com

UTF-8

1.7

1.7

junit

junit

4.11

test

junit

junit

4.11

test

org.slf4j

slf4j-api

1.7.12

ch.qos.logback

logback-core

1.1.1

mysql

mysql-connector-java

5.1.36

runtime

c3p0

c3p0

0.9.1.2

org.mybatis

mybatis

3.4.1

org.mybatis

mybatis-spring

1.3.0

taglibs

standard

1.1.2

javax.servlet

jstl

1.2

com.fasterxml.jackson.core

jackson-core

2.8.1

com.fasterxml.jackson.core

jackson-databind

2.8.1

javax.servlet

javax.servlet-api

3.1.0

org.springframework

spring-core

4.1.7.RELEASE

org.springframework

spring-beans

4.1.7.RELEASE

org.springframework

spring-context

4.1.7.RELEASE

org.springframework

spring-jdbc

4.1.7.RELEASE

org.springframework

spring-tx

4.1.7.RELEASE

org.springframework

spring-web

4.1.7.RELEASE

org.springframework

spring-webmvc

4.1.7.RELEASE

org.springframework

spring-test

4.1.7.RELEASE

commons-io

commons-io

1.3.2

commons-fileupload

commons-fileupload

1.2.1

Gratuation_example

maven-clean-plugin

3.1.0

maven-resources-plugin

3.0.2

maven-compiler-plugin

3.8.0

maven-surefire-plugin

2.22.1

maven-war-plugin

3.2.2

maven-install-plugin

2.5.2

maven-deploy-plugin

2.8.2

这里是 maven 包的自动导入,大家把这些导入后等待就 ok 了。

jdbc.properties 文件

jdbc.driver=com.mysql.jdbc.Driver

jdbc.url=jdbc:mysql://localhost:3306/douban_movie?useUnicode=true&characterEncoding=utf-8&useSSL=false

jdbc.username=root

jdbc.password=root

jdbc.initialPoolSize=10

jdbc.maxPoolSize=30

jdbc.minPoolSize=10

jdbc.checkoutTimeout=1000

jdbc.acquireRetryAttempts=2

jdbc.idleConnectionTestPeriod=60

jdbc.maxIdleTime=240

jdbc.acquireIncrement=5

jdbc.maxConnectionAge=3000

jdbc.maxStatements=0

log4j.porperties 文件

log4j.logger.org.mybatis=TRACE

log4j.logger.com.suny.dao=TRACE

log4j.rootLogger=WARN, stdout

log4j.appender.stdout=org.apache.log4j.ConsoleAppender

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n

log4j.appender.logfile=org.apache.log4j.FileAppender

log4j.appender.logfile.File=target/spring.log

log4j.appender.logfile.layout=org.apache.log4j.PatternLayout

log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n

mybatis-config.xml 文件

/p>

PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-config.dtd">

logback.xml 文件

%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n

spring-dao.xml 文件

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 http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

spring-service.xml 文件

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:context="http://www.springframework.org/schema/context"

xmlns:tx="http://www.springframework.org/schema/tx"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

spring-web.xml 文件

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 http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

web.xml 文件

/p>

"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"

"http://java.sun.com/dtd/web-app_2_3.dtd" >

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee

http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"

version="3.1"

metadata-complete="true">

Archetype Created Web Application

index.jsp

mvc-dispatcher

org.springframework.web.servlet.DispatcherServlet

contextConfigLocation

classpath:spring/spring-*.xml

1

mvc-dispatcher

/

到此基本配置结束,接下来就是代码的部分

5d1fe5b24993

xs09.png

User 实体类

package com.example.entity;

import com.fasterxml.jackson.annotation.JsonInclude;

/**

* author: Jiwenjie

* email: Jiwenjie97@gmail.com

* time: 2018-12-22

* desc:

*/

@JsonInclude(JsonInclude.Include.NON_NULL) // 去除返回接口值为 null 的字段

public class User {

private Integer id;

private String username;

private String phone;

private int isAdmin;

private String avatar;

private String password;

@Override

public String toString() {

return "User{" +

"id=" + id +

", username='" + username + '\'' +

", phone='" + phone + '\'' +

", isAdmin=" + isAdmin +

", avatar='" + avatar + '\'' +

", password='" + password + '\'' +

'}';

}

public Integer getId() {

return id;

}

public void setId(Integer id) {

this.id = id;

}

public String getUsername() {

return username;

}

public void setUsername(String username) {

this.username = username;

}

public String getPhone() {

return phone;

}

public void setPhone(String phone) {

this.phone = phone;

}

public String getAvatar() {

return avatar;

}

public void setAvatar(String avatar) {

this.avatar = avatar;

}

public int getIsAdmin() {

return isAdmin;

}

public void setIsAdmin(int isAdmin) {

this.isAdmin = isAdmin;

}

public String getPassword() {

return password;

}

public void setPassword(String password) {

this.password = password;

}

}

UserDao 接口

package com.example.dao;

import com.example.entity.User;

import org.apache.ibatis.annotations.Param;

import org.springframework.stereotype.Repository;

/**

* author: Jiwenjie

* email: Jiwenjie97@gmail.com

* time: 2018-12-22

* desc:

*/

@Repository

public interface UserDao {

void registerUser(@Param("username") String username, @Param("password") String password, @Param("phone") String phone);

User userLogin(@Param("username") String username, @Param("password") String password);

User findUserByName(@Param("username") String username);

User findUserByPhone(@Param("phone") String phone);

}

UserDao.xml 文件,名字要与 UserDao 完全一致才可以匹配对应

/p>

PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

INSERT INTO users (username, password, phone) VALUES (#{username}, #{password}, #{phone})

SELECT id, username, phone, avatar, is_admin FROM users WHERE username = #{username} AND password = #{password}

SELECT id, username, phone, avatar, is_admin FROM users WHERE username=#{username}

SELECT id, username, phone, avatar, is_admin FROM users WHERE phone = #{phone}

UserService 接口

package com.example.service;

import com.example.entity.User;

/**

* author: Jiwenjie

* email: Jiwenjie97@gmail.com

* time: 2018-12-22

* desc:

*/

public interface UserService {

void registerUser(String username, String password, String phone);

User userLogin(String username, String password);

User findUserByName(String username);

User findUserByPhone(String phone);

}

service 的实现类

package com.example.service.impl;

import com.example.dao.UserDao;

import com.example.entity.User;

import com.example.service.UserService;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

/**

* author: Jiwenjie

* email: Jiwenjie97@gmail.com

* time: 2018-12-22

* desc:

*/

@Service

public class UserServiceImpl implements UserService {

@Autowired

private UserDao userDao;

@Override

public void registerUser(String username, String password, String phone) {

userDao.registerUser(username, password, phone);

}

@Override

public User userLogin(String username, String password) {

return userDao.userLogin(username, password);

}

@Override

public User findUserByName(String username) {

return userDao.findUserByName(username);

}

@Override

public User findUserByPhone(String phone) {

return userDao.findUserByPhone(phone);

}

}

UserController 实现类

package com.example.controller;

import com.example.common.Constant;

import com.example.entity.User;

import com.example.service.UserService;

import com.fasterxml.jackson.databind.annotation.JsonSerialize;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.http.HttpStatus;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpSession;

import java.util.HashMap;

import java.util.Map;

/**

* author: Jiwenjie

* email: Jiwenjie97@gmail.com

* time: 2018-12-22

* desc:

*/

@Controller

@RequestMapping(value = "/user")

public class UserController {

@Autowired

private UserService userService;

@Autowired

private HttpSession session;

/**

* 注册用户接口

* @param username 用户名

* @param password 密码

* @param phone 手机号

* @return 注册结果

*/

@RequestMapping(value = "/register", method = RequestMethod.POST)

@ResponseBody

public Map registerUser(@RequestParam String username, @RequestParam String password, @RequestParam String phone) {

Map map = new HashMap<>();

System.out.println("进入注册响应");

System.out.println("用户名:" + username);

System.out.println("密码:" + password);

System.out.println("手机号:" + phone);

/**

* 是否存在相同用户名用户

*/

User nUser = userService.findUserByName(username);

User pUser = userService.findUserByPhone(phone);

if (nUser != null) {

map.put("message", "the username has been register");

map.put("code", HttpStatus.BAD_REQUEST.value());

} else if (pUser != null) {

map.put("message", "the phone number has been register");

map.put("code", HttpStatus.BAD_REQUEST.value());

} else {

try {

userService.registerUser(username, password, phone);

map.put("message", "succeed");

map.put("code", HttpStatus.OK.value());

} catch (Exception e) {

map.put("message", "failed");

map.put("code", HttpStatus.BAD_REQUEST.value());

e.printStackTrace();

}

}

return map;

}

/**

* 用户登录接口

*

* @param username 用户名

* @param password 密码

* @return 登录结果

*/

@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)

@RequestMapping(value = "/login", method = RequestMethod.POST)

@ResponseBody

public Map userLogin(@RequestParam String username, @RequestParam String password) {

Map map = new HashMap<>();

System.out.println("进入登陆接口");

System.out.println("用户名:" + username);

System.out.println("密码:" + password);

User user = userService.userLogin(username, password);

if (user != null) {

session.setAttribute(Constant.SESSION_USER, user);

map.put("user", user);

map.put("code", HttpStatus.OK.value());

map.put("message", "succeed");

System.out.println("登陆成功");

} else {

map.put("message", "not register");

map.put("code", HttpStatus.NOT_FOUND.value());

System.out.println("登陆失败");

}

return map;

}

}

AuthorizationInterceptor 权限校验

package com.jiwenjie.common.interceptor;

import com.jiwenjie.common.Constant;

import com.jiwenjie.common.auth.AuthPassport;

import com.jiwenjie.entity.User;

import org.springframework.http.HttpStatus;

import org.springframework.web.method.HandlerMethod;

import org.springframework.web.servlet.HandlerInterceptor;

import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.PrintWriter;

/**

* author: Jiwenjie

* email: Jiwenjie97@gmail.com

* time: 2018-12-13

* desc:

*/

public class AuthorizationInterceptor implements HandlerInterceptor {

@Override

public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object handler) throws Exception {

if (handler.getClass().isAssignableFrom(HandlerMethod.class)) {

AuthPassport authPassport = ((HandlerMethod) handler).getMethodAnnotation(AuthPassport.class);

if (authPassport == null) {

System.out.println(httpServletRequest.getRequestURL().toString());

return true;

} else {

User user = (User) httpServletRequest.getSession().getAttribute(Constant.SESSION_USER);

if (user == null) {

httpServletResponse.setStatus(HttpStatus.FORBIDDEN.value());

PrintWriter pw = httpServletResponse.getWriter();

pw.write("{\"code\" : 403, \"message\" : \"Need Login\"}");

pw.flush();

pw.close();

return false;

} else

return true;

}

}

return false;

}

@Override

public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {

System.out.println("AuthorizationInterceptor: postHandle -->");

}

@Override

public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {

System.out.println("AuthorizationInterceptor: afterCompletion -->");

}

}

自定义接口

package com.jiwenjie.common.auth;

import java.lang.annotation.*;

/**

* author: Jiwenjie

* email: Jiwenjie97@gmail.com

* time: 2018-12-13

* desc:

*/

@Documented

@Inherited

@Target(ElementType.METHOD)

@Retention(RetentionPolicy.RUNTIME)

public @interface AdminPassport {

}

package com.jiwenjie.common.auth;

import java.lang.annotation.*;

/**

* author: Jiwenjie

* email: Jiwenjie97@gmail.com

* time: 2018-12-13

* desc:

*/

@Documented

@Inherited

@Target(ElementType.METHOD)

@Retention(RetentionPolicy.RUNTIME)

public @interface AuthPassport {

}

public class Constant {

public static final String SESSION_USER = "session_user";

}

所有的代码文件到此基本完成。接下来来看下配置 tomcat

5d1fe5b24993

xs10.png

5d1fe5b24993

xs11.png

5d1fe5b24993

xs12.png

5d1fe5b24993

xs13.png

好,接下来就是运行就可以证明后台搭建成功了。

5d1fe5b24993

xs14.png

这是点击按钮后运行成功的结果,点击提交我们再看

5d1fe5b24993

xs15.png

是不是发现一个很神奇的事,返回的是 json 数据而不是网页,这里大家可以去看看源码,其实 json 的底层就是 hashMap。再次说明了基础知识的重要。

好了后台的搭建就到这里,我会在写一篇文章来继续描述。

源码会在整理有编辑放出。

这里做了修改,进行了简化处理,只有登陆和注册,确保我们的主要目的就是打通前后台

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值