【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】
**开源地址:https://docs.qq.com/doc/DSmxTbFJ1cmN1R2dB **
<util:properties id=“jdbc” location=“classpath:db.properties” />
<bean id=“ds” class=“org.apache.commons.dbcp.BasicDataSource”
destroy-method=“close”>
db.properties
driverclass=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:orcl
user=learn
password=learn
maxActive=1
initSize=1
LoginController.java
package com.dk.oss.controller;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.dk.oss.entity.Admin;
import com.dk.oss.service.AdminService;
import com.dk.oss.service.AppException;
@Controller
public class LoginController {
@Resource(name=“adminService”)
private AdminService adminService;
@RequestMapping(“/toLogin.do”)
public String toLogin(){
return “login”;
}
@RequestMapping(“/login.do”)
public String checkLogin(HttpServletRequest request){
//读取请求参数值
String adminCode = request.getParameter(“adminCode”);
String pwd = request.getParameter(“pwd”);
System.out.println(“adminCode:”+adminCode+" pwd:"+pwd);
//调用业务层模块来进行登录处理。
try{
Admin admin= adminService.checkLogin(adminCode, pwd);
System.out.println(admin);//Integer.valueOf(“a”);
}catch(Exception e){
if(e instanceof AppException){
//应用异常,需要明确提示用户。
request.setAttribute(“errorMsg”, e.getMessage());
System.out.println(“自定义异常。。。”);
//转发到登录页面。
return “login”;
}else{
//系统异常,提示用户稍后重试。
System.out.println(“系统异常。。。”+e.getMessage());
return “error”;
}
}
//登录成功,重定向到首页。
return “redirect:index.do”;
}
@RequestMapping(“/index.do”)
public String toIndex(){
return “index”;
}
}
AdminService.java
package com.dk.oss.service;
import com.dk.oss.entity.Admin;
/**
-
业务层接口
-
@author Cher_du
*/
public interface AdminService {
//用于登录处理
public Admin checkLogin(String code,String pwd);
}
AdminServiceImpl.java
package com.dk.oss.service;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import com.dk.oss.dao.AdminDAO;
import com.dk.oss.entity.Admin;
/**
-
业务层实现
-
@author Cher_du
*/
@Service(“adminService”)
public class AdminServiceImpl implements AdminService{
@Resource(name=“adminDAO”)
private AdminDAO adminDAO;
public Admin checkLogin(String code, String pwd) {
//调用AdminDAO访问数据库
Admin admin = adminDAO.findByCode(code);
if(admin == null){
//账户不存在,需要提示用户。
//抛出一个应用异常(用户在使用系统
//的过程当中,做了一些错误的操作,比如
//输出入错误的账户或密码)。
throw new AppException(“账户错误”);
}
if(!admin.getPassword().equals(pwd)){
//密码错误,需要提示用户。
throw new AppException(“密码错误”);
}
//登录成功
return admin;
}
}
AppException.java
package com.dk.oss.service;
/**
-
应用异常类。
-
@author Cher_du
*/
public class AppException extends RuntimeException {
public AppException() {
}
public AppException(String message) {
super(message);
}
}
AdminDAO.java
package com.dk.oss.dao;
import com.dk.oss.entity.Admin;
/**
-
DAO接口
-
注:
-
任何接口,都不要涉及任何具体的实现。
-
@author Cher_du
*/
public interface AdminDAO {
public Admin findByCode(String code);
}
AdminDAOJdbcImpl.java
package com.dk.oss.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.annotation.Resource;
import javax.sql.DataSource;
import org.springframework.stereotype.Repository;
import com.dk.oss.entity.Admin;
/**
-
DAO实现类
-
@author Cher_du
-
@Resource默认按照名称方式进行bean匹配,@Autowired默认按照类型方式进行bean匹配
*/
@Repository(“adminDAO”)
public class AdminDAOJdbcImpl implements AdminDAO{
//注入datasource。
@Resource(name=“ds”)
private DataSource ds;
public Admin findByCode(String code) {
Admin admin = null;
Connection conn = null;
PreparedStatement prep = null;
ResultSet rst = null;
try {
conn = ds.getConnection();
String sql = "SELECT * FROM admin_info "
+“WHERE admin_code=?”;
prep = conn.prepareStatement(sql);
prep.setString(1, code);
rst = prep.executeQuery();
if(rst.next()){
admin = new Admin();
admin.setAdminId(rst.getInt(“admin_id”));
admin.setAdminCode(rst.getString(“admin_code”));
admin.setPassword(rst.getString(“password”));
admin.setName(rst.getString(“name”));
admin.setTelephone(rst.getString(“telephone”));
admin.setEmail(rst.getString(“email”));
admin.setEnrolldate(rst.getTimestamp(“enrolldate”));
}
} catch (SQLException e) {
//记日志(保留现场)
e.printStackTrace();
/*
-
异常能否恢复,如果不能够恢复
-
(发生了系统异常,比如数据库服务
-
暂停,网络中断),则提示用户稍后
-
重试。如果能够恢复,则立即恢复。
*/
throw new RuntimeException(e);
}finally{
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return admin;
}
}
Admin.java
package com.dk.oss.entity;
import java.sql.Timestamp;
/**
-
实体类
-
注:
-
与要操作的表保持一致。
-
@author Cher_du
*/
public class Admin {
private Integer adminId;
private String adminCode;
private String password;
private String name;
private String telephone;
private String email;
private Timestamp enrolldate;
public Integer getAdminId() {
return adminId;
}
public void setAdminId(Integer adminId) {
this.adminId = adminId;
}
public String getAdminCode() {
return adminCode;
}
public void setAdminCode(String adminCode) {
this.adminCode = adminCode;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTelephone() {
return telephone;
}
public void setTelephone(String telephone) {
this.telephone = telephone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Timestamp getEnrolldate() {
return enrolldate;
}
public void setEnrolldate(Timestamp enrolldate) {
this.enrolldate = enrolldate;
}
}
***为了使编写的每一层代码没有问题,需要对其进行单元测试,尽可能减少开发失误。
TestCase.java
package test;
import java.sql.SQLException;
import java.util.List;
import javax.sql.DataSource;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.dk.oss.dao.AdminDAO;
import com.dk.oss.dao.CostDAO;
import com.dk.oss.entity.Admin;
import com.dk.oss.entity.Cost;
import com.dk.oss.service.AdminService;
public class TestCase {
@Test
//测试DataSource
public void test1() throws SQLException{
ApplicationContext ac =
new ClassPathXmlApplicationContext(
“app.xml”);
System.out.println(ac);
DataSource ds= ac.getBean(“ds”, DataSource.class);
System.out.println(ds.getConnection());
}
@Test
//测试DAO
public void test2(){
ApplicationContext ac =
new ClassPathXmlApplicationContext(
“app.xml”);
AdminDAO adminDAO = ac.getBean(“adminDAO”, AdminDAO.class);
Admin admin= adminDAO.findByCode(“caocao”);
System.out.println(admin.getPassword());
}
@Test
//测试AdminService
public void test3(){
ApplicationContext ac = new ClassPathXmlApplicationContext(“app.xml”);
AdminService adminService = ac.getBean(“adminService”, AdminService.class);
Admin admin = adminService.checkLogin(“caocao”, “123”);
System.out.println(admin.getTelephone());
}
@Test
//测试CostDAO
public void test4(){
ApplicationContext ac = new ClassPathXmlApplicationContext(“app.xml”);
CostDAO dao = ac.getBean(“costDAO”, CostDAO.class);
List costs = dao.findAll();
System.out.println(costs);
}
}
启动Tomcat 运行 springcase-netctoss工程,录入请求http://localhost:8088/springcase-netctoss/toLogin.do
页面运行结果对应如下
录入账户与密码的不同情况:
正确:
错误:
对应练习 资费Cost部分参考代码:
Cost.java
package com.dk.oss.entity;
import java.sql.Timestamp;
/**
-
实体类
-
@author Cher_du
*/
public class Cost {
private Integer costId;
private String name;
//基本时长
private Integer baseDuration;
//基本费用
private Double baseCost;
//单位费用
private Double unitCost;
//状态:0-启用;1-禁用;
private String status;
//描述
private String descr;
//创建时间
private Timestamp creatime;
//开通时间
private Timestamp startime;
//资费类型:1-包月;2-套餐;3-计时;
private String costType;
@Override
public String toString() {
return “Cost [costId=” + costId + “, name=” + name + “, baseDuration=” + baseDuration + “, baseCost=” + baseCost
-
“, unitCost=” + unitCost + “, status=” + status + “, descr=” + descr + “, creatime=” + creatime
-
“, startime=” + startime + “, costType=” + costType + “]”;
}
public Integer getCostId() {
return costId;
}
public void setCostId(Integer costId) {
this.costId = costId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getBaseDuration() {
return baseDuration;
}
public void setBaseDuration(Integer baseDuration) {
this.baseDuration = baseDuration;
}
public Double getBaseCost() {
return baseCost;
}
public void setBaseCost(Double baseCost) {