JavaWeb 期末項目設計 業務邏輯與實現


1.1 業務邏輯設計與實現

業務邏輯層主要由控制層實現,需要實現的需求:

登陸注冊:RegisterController:

package com.dpqq.springboot.web.controller;
import com.dpqq.springboot.web.Entity.User;
import com.dpqq.springboot.web.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.Map;
@Controller
public class RegisterController {
@Autowired
UserRepository userRepository;
@PostMapping(value = "/register")
public String register(@RequestParam("name") String name, String gender,
@RequestParam("phone") String phone,
@RequestParam("password") String password,
Map<String,String> map){
// 判斷數據合法性
if(name.length()>4 || name.isEmpty()){map.put("warning1","姓名小於4個字");}
if(password.length()>16 || password.length()<8){map.put("warning2","密碼8位到16位");}
if(phone.length()!=11){map.put("warning3","手機號11位");}
if(userRepository.existsByPhone(phone)){map.put("warning3","手機號已存在");}
if(!isNumeric(phone)){map.put("warning3","手機號數字");}
if(gender==null){map.put("warning4","性別不為空");}
// 合法則設置用戶信息並保存至數據庫
if(map.isEmpty()){
User user = new User();
user.setPassword(password);
user.setPhone(phone);
user.setName(name);
user.setGender(gender);
userRepository.save(user);
return "login";
}
// 不合法返回注冊頁
else{return "register";}

}
//判斷字符串是否是數字函數
public static boolean isNumeric(String str)
{
for (int i =0;i<str.length();i++)
{
if(!Character.isDigit(str.charAt(i)))
{
return false;
}
}
return true;
}
}

package com.dpqq.springboot.web.controller;


import com.dpqq.springboot.web.Entity.User;
import com.dpqq.springboot.web.repository.CardRepository;
import com.dpqq.springboot.web.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import javax.servlet.http.HttpSession;
import java.util.Map;


@Controller
public class LoginController {
@Autowired
UserRepository userRepository;
@Autowired
CardRepository cardRepository;
@PostMapping(value = "/user/login")
public String login(@RequestParam("phone") String phone,
@RequestParam("password") String password,
Map<String,String> map, HttpSession session){
// 判斷數據合法性
if(password.length()>16 || password.length()<8){map.put("warning2","密碼8位到16位");}
if(phone.length()!=11){map.put("warning1","手機號11位");}
// 數據合法進一步判斷,不合法返回登錄頁
if(map.isEmpty()) {
// 判斷是否存在手機號密碼匹配,存在即登陸可以登陸重定向至首頁,不存在返回登錄頁
if (userRepository.existsByPhoneAndPassword(phone, password)) {
User user = userRepository.findByPhone(phone);
// 登陸后就再session中存放用戶信息
session.setAttribute("loginUser",user);
return "redirect:/";
} else {
map.put("msg", "用戶名或密碼錯誤!");
return "login";
}
}
else{return "login";}
}
}

辦卡:CardAddController:

 

package com.dpqq.springboot.web.controller;

import com.dpqq.springboot.web.Entity.Card;
import com.dpqq.springboot.web.Entity.User;
import com.dpqq.springboot.web.repository.CardRepository;
import com.dpqq.springboot.web.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.HttpSession;
import java.util.Date;
import java.util.Map;
import java.util.UUID;
@Controller // 表示這是一個控制器類
public class CardAddController {
@Autowired
private CardRepository cardRepository;
@Autowired
private UserRepository userRepository;
// @RequestMapping(
// method = {RequestMethod.POST}
//)
@PostMapping(value = "/CardAdd")
// 接受前台發送的數據
public String CardAdd(@RequestParam("cardpassword") String cardpassword ,
@RequestParam("phone") String phone ,
@RequestParam("password") String password,
Map<String,String> map ,
HttpSession session){
// 判斷數據合法性
if(cardpassword.length()>16 || cardpassword.length()<8){map.put("warning1","密碼8位到16位");}
if(password.length()>16 || password.length()<8){map.put("warning3","密碼8位到16位");}
if(phone.length()!=11){map.put("warning2","手機號11位");}
// 合法則再數據庫增加卡信息
if(map.isEmpty()){
// 通過輸入的手機號和密碼判斷是否存在,否則返回申請頁
if(userRepository.existsByPhoneAndPassword(phone, password)){
User user=new User();
user=userRepository.findByPhone(phone);
Card card=new Card();
String CardNum=getUUID(); // 獲取隨機生成16位卡號
// 設置用戶和卡的信息,最后保存進數據庫
user.setCard(CardNum);
card.setCardNum(CardNum);
card.setCardpassword(cardpassword);
card.setDate(new Date());
card.setBalance(0);
cardRepository.save(card);
userRepository.save(user);
// 添加用戶卡信息到session中
User loginUser = (User)session.getAttribute("loginUser");
Card loginUserCard=cardRepository.findByCardNum(loginUser.getCard());
session.setAttribute("loginUserCard",loginUserCard);
map.put("CardNum",CardNum);
return "ApplyCardSuccess";
}
else
{
map.put("msg","不存在此賬戶");
return "CardApply";
}
}
else {
return "CardApply";
}

}
//生成
// 16位唯一性的訂單號
public static String getUUID(){
//隨機生成一位整數
int random = (int) (Math.random()*9+1);
String valueOf = String.valueOf(random);
//生成uuid的hashCode值
int hashCode = UUID.randomUUID().toString().hashCode();
//可能為負數
if(hashCode<0){
hashCode = -hashCode;
}
String value = valueOf + String.format("%015d", hashCode);
return value;
}
}

 

存錢savemoneyController:

 

package com.dpqq.springboot.web.controller;

import com.dpqq.springboot.web.Entity.Card;
import com.dpqq.springboot.web.Entity.User;
import com.dpqq.springboot.web.repository.CardRepository;
import com.dpqq.springboot.web.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;

import javax.servlet.http.HttpSession;
import java.util.Map;

@Controller
public class SaveMoneyController {
@Autowired
UserRepository userRepository;
@Autowired
CardRepository cardRepository;
@GetMapping(value = "savemoney")
public String savemoney(HttpSession session, Map<String,String> map){
// 判斷session中是否有用戶信息,沒有則不能存錢,返回首頁
if(session.getAttribute("loginUser")==null){return "/";}
// 有用戶信息進一步判斷有沒有辦卡
else{
// 取出用戶信息
User user=(User)session.getAttribute("loginUser");
// 判斷辦卡與否,沒辦卡跳轉辦卡頁面,否則進入存錢頁面
if(user.getCard()==null){map.put("msg","請先辦卡再存錢!"); return "CardApply";}
else {
Card card=cardRepository.findByCardNum(user.getCard());
session.setAttribute("loginUserCard",card);
return "savemoney" ;
}
}
}
@PostMapping(value = "/Tosavemoney")
public String savemoney( String balance,Map<String,String> map,HttpSession session){
// 判斷數據合法性
if(balance.isEmpty()){map.put("warning","金額不為空!"); }
if(!isNumeric(balance)){map.put("warning","含數字以外字符!"); }
if(map.isEmpty()){
// 因為是從session中取登陸后的用戶信息,所以無需判斷數據庫中是否存在要素,取出用戶信息后直接與輸入的賬戶卡號
// 進行轉賬操作
User user=(User)session.getAttribute("loginUser");
// 獲取用戶信息中的卡號
Card card=cardRepository.findByCardNum(user.getCard());
// 設置卡的金額
card.setBalance(card.getBalance()+Integer.parseInt(balance));
// 保存進數據庫,更新金額
cardRepository.save(card);
return "savemoneySuccess";
}
// 數據不合法返回存錢頁
else {return "savemoney";}

}
//判斷字符串是否是數字函數
public static boolean isNumeric(String str)
{
for (int i =0;i<str.length();i++)
{
if(!Character.isDigit(str.charAt(i)))
{
return false;
}
}
return true;
}
}

 

轉賬TranferAccountController:

 

package com.dpqq.springboot.web.controller;

import com.dpqq.springboot.web.Entity.Card;
import com.dpqq.springboot.web.Entity.User;
import com.dpqq.springboot.web.repository.CardRepository;
import com.dpqq.springboot.web.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;

import javax.servlet.http.HttpSession;
import java.util.Map;

@Controller
public class SaveMoneyController {
@Autowired
UserRepository userRepository;
@Autowired
CardRepository cardRepository;
@GetMapping(value = "savemoney")
public String savemoney(HttpSession session, Map<String,String> map){
// 判斷session中是否有用戶信息,沒有則不能存錢,返回首頁
if(session.getAttribute("loginUser")==null){return "/";}
// 有用戶信息進一步判斷有沒有辦卡
else{
// 取出用戶信息
User user=(User)session.getAttribute("loginUser");
// 判斷辦卡與否,沒辦卡跳轉辦卡頁面,否則進入存錢頁面
if(user.getCard()==null){map.put("msg","請先辦卡再存錢!"); return "CardApply";}
else {
Card card=cardRepository.findByCardNum(user.getCard());
session.setAttribute("loginUserCard",card);
return "savemoney" ;
}
}
}
@PostMapping(value = "/Tosavemoney")
public String savemoney( String balance,Map<String,String> map,HttpSession session){
// 判斷數據合法性
if(balance.isEmpty()){map.put("warning","金額不為空!"); }
if(!isNumeric(balance)){map.put("warning","含數字以外字符!"); }
if(map.isEmpty()){
// 因為是從session中取登陸后的用戶信息,所以無需判斷數據庫中是否存在要素,取出用戶信息后直接與輸入的賬戶卡號
// 進行轉賬操作
User user=(User)session.getAttribute("loginUser");
// 獲取用戶信息中的卡號
Card card=cardRepository.findByCardNum(user.getCard());
// 設置卡的金額
card.setBalance(card.getBalance()+Integer.parseInt(balance));
// 保存進數據庫,更新金額
cardRepository.save(card);
return "savemoneySuccess";
}
// 數據不合法返回存錢頁
else {return "savemoney";}

}
//判斷字符串是否是數字函數
public static boolean isNumeric(String str)
{
for (int i =0;i<str.length();i++)
{
if(!Character.isDigit(str.charAt(i)))
{
return false;
}
}
return true;
}
}

 

銷戶CancellationController:

 

 

package com.dpqq.springboot.web.controller;

import com.dpqq.springboot.web.Entity.Card;
import com.dpqq.springboot.web.Entity.User;
import com.dpqq.springboot.web.repository.CardRepository;
import com.dpqq.springboot.web.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;

import javax.servlet.http.HttpSession;
import java.util.Map;

@Controller
public class SaveMoneyController {
@Autowired
UserRepository userRepository;
@Autowired
CardRepository cardRepository;
@GetMapping(value = "savemoney")
public String savemoney(HttpSession session, Map<String,String> map){
// 判斷session中是否有用戶信息,沒有則不能存錢,返回首頁
if(session.getAttribute("loginUser")==null){return "/";}
// 有用戶信息進一步判斷有沒有辦卡
else{
// 取出用戶信息
User user=(User)session.getAttribute("loginUser");
// 判斷辦卡與否,沒辦卡跳轉辦卡頁面,否則進入存錢頁面
if(user.getCard()==null){map.put("msg","請先辦卡再存錢!"); return "CardApply";}
else {
Card card=cardRepository.findByCardNum(user.getCard());
session.setAttribute("loginUserCard",card);
return "savemoney" ;
}
}
}
@PostMapping(value = "/Tosavemoney")
public String savemoney( String balance,Map<String,String> map,HttpSession session){
// 判斷數據合法性
if(balance.isEmpty()){map.put("warning","金額不為空!"); }
if(!isNumeric(balance)){map.put("warning","含數字以外字符!"); }
if(map.isEmpty()){
// 因為是從session中取登陸后的用戶信息,所以無需判斷數據庫中是否存在要素,取出用戶信息后直接與輸入的賬戶卡號
// 進行轉賬操作
User user=(User)session.getAttribute("loginUser");
// 獲取用戶信息中的卡號
Card card=cardRepository.findByCardNum(user.getCard());
// 設置卡的金額
card.setBalance(card.getBalance()+Integer.parseInt(balance));
// 保存進數據庫,更新金額
cardRepository.save(card);
return "savemoneySuccess";
}
// 數據不合法返回存錢頁
else {return "savemoney";}

}
//判斷字符串是否是數字函數
public static boolean isNumeric(String str)
{
for (int i =0;i<str.length();i++)
{
if(!Character.isDigit(str.charAt(i)))
{
return false;
}
}
return true;
}
}

 

1.2 表現層設計與實現

表現層用thtmeleaf模板引擎,導入bootstrapwebjars,使用其中的css

 

 

 

1.3 項目難點及解決方案

問題報錯1

JPARepository中自動定義查詢方法的駝峰命名不是十分理解深刻,只知道單詞中間大寫會變成下划線加小寫,當我有一個字段中間有大寫單詞時,編寫JPARepository自定義方法時報錯。

解決方案:

我大概知道錯誤,就把實體類中字段改成小寫,再把數據庫表刪除,重新啟動則運行通過。

問題難點2

編寫MvcConfig配置類時,在網上看到的時配置WebMvcConfigAdapter,但是我像實現這個接口是顯示方法棄用。

解決方案:

嘗試webmvcConfig實現,發現這個與WebMvcConfigAdapter可實現的方法一致,得到解決。

1.4 典型代碼片段與設計過程

配置攔截器:

 

package com.dpqq.springboot.web.component;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//配置攔截器,重寫攔截器必要方法
public class ApplyCardHandlerInterceptor implements HandlerInterceptor{
@Override //重寫方法
// 重寫預處理方法,返回值Boolean 通行與不通行
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
// 從Session根據鍵“loginUser”取值,賦值給user
Object user=request.getSession().getAttribute("loginUser");
// 判斷取值是否為空,為空則表示沒有登陸,跳轉回登錄頁,否則表示登陸了,放行
if(user == null){
request.setAttribute("msg","請先登陸");
request.getRequestDispatcher("/login").forward(request,response);
return false;
}
else{return true;}
}

@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

}

@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

}
}

MvcConfig添加攔截器:

 

 

package com.dpqq.springboot.web.component;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//配置攔截器,重寫攔截器必要方法
public class ApplyCardHandlerInterceptor implements HandlerInterceptor{
@Override //重寫方法
// 重寫預處理方法,返回值Boolean 通行與不通行
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
// 從Session根據鍵“loginUser”取值,賦值給user
Object user=request.getSession().getAttribute("loginUser");
// 判斷取值是否為空,為空則表示沒有登陸,跳轉回登錄頁,否則表示登陸了,放行
if(user == null){
request.setAttribute("msg","請先登陸");
request.getRequestDispatcher("/login").forward(request,response);
return false;
}
else{return true;}
}

@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

}

@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

}
}

DuridConfig配置durid數據源:

 

package com.dpqq.springboot.web.config;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.servlet.Filter;
import javax.sql.DataSource;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

@Configuration //配置注解,表示這是一個配置類
public class DuridConfig {
//按application.yml中前綴為“spring.datasource”屬性
@ConfigurationProperties(prefix = "spring.datasource")
@Bean //注解Bean,加入容器以使用
public DataSource druid(){
return new DruidDataSource();
}
@Bean //注解Bean,加入容器以使用
public ServletRegistrationBean StatViewServlet(){
// 聲明ServletRegistrationBean並配置路由
ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
Map<String,String> initparams = new HashMap<>();
// 設置登陸用戶及密碼,放行路由
initparams.put("loginUsername","admin");
initparams.put("loginPassword","123456");
initparams.put("allow","");
// initparams.put("deny","localhost");
bean.setInitParameters(initparams);
return bean;
}
@Bean
// 配置過濾器
public FilterRegistrationBean webStatFilter(){
FilterRegistrationBean<Filter> bean = new FilterRegistrationBean<>();
bean.setFilter(new WebStatFilter());
Map<String,String> initparams = new HashMap<>();
initparams.put("exclusions","*.js,*.css");
bean.setInitParameters(initparams);
bean.setUrlPatterns(Arrays.asList("/*"));
return bean;
}
}

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM