最全SpringMVC入门第三部分,阿里巴巴蚂蚁金服2024金融核心部门实习面经

最后

看完上述知识点如果你深感Java基础不够扎实,或者刷题刷的不够、知识不全面

小编专门为你量身定制了一套<Java一线大厂高岗面试题解析合集:JAVA基础-中级-高级面试+SSM框架+分布式+性能调优+微服务+并发编程+网络+设计模式+数据结构与算法>

image

针对知识面不够,也莫慌!还有一整套的<Java核心进阶手册>,可以瞬间查漏补缺

image

全都是一丢一丢的收集整理纯手打出来的

更有纯手绘的各大知识体系大纲,可供梳理:Java筑基、MySQL、Redis、并发编程、Spring、分布式高性能架构知识、微服务架构知识、开源框架知识点等等的xmind手绘图~

image

image

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

org.springframework

spring-test

5.0.5.RELEASE

junit

junit

4.13.1

mysql

mysql-connector-java

5.1.32

c3p0

c3p0

0.9.1.2

com.alibaba

druid

1.1.10

org.springframework

spring-jdbc

5.0.5.RELEASE

org.springframework

spring-tx

5.0.5.RELEASE

org.springframework

spring-web

5.0.5.RELEASE

org.springframework

spring-webmvc

5.0.5.RELEASE

javax.servlet

servlet-api

2.5

provided

javax.servlet.jsp

jsp-api

2.0

provided

javax.servlet

jstl

1.2

taglibs

standard

1.1.2

2.web.xml进行配置


Tips: 字符编码的Filter配置要在支持REST风格的filter配置之前

DispatcherServlet

org.springframework.web.servlet.DispatcherServlet

contextConfigLocation

classpath:SpringMVC.xml

1

DispatcherServlet

/

CharacterEncodingFilter

org.springframework.web.filter.CharacterEncodingFilter

encoding

UTF-8

forceEncoding

true

CharacterEncodingFilter

/*

HiddenHttpMethodFilter

org.springframework.web.filter.HiddenHttpMethodFilter

HiddenHttpMethodFilter

/*

3.SpringMVC.xml配置


<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns=“http://www.springframework.org/schema/beans”

xmlns:context=“http://www.springframework.org/schema/context”

xmlns:mvc=“http://www.springframework.org/schema/mvc”

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

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

<mvc:annotation-driven />

<context:component-scan base-package=“com”/>


数据库环境搭建

======================================================================

在这里插入图片描述

1.propertise配置文件


jdbc.driver=com.mysql.jdbc.Driver

jdbc.url=jdbc:mysql://localhost:3306/tx

jdbc.username=root

jdbc.password=xxxxxxx

2.在Spring容器中引入pro配置文件,配置数据源,配置JDBCTemplate对象


SpringMVC.xml

<context:property-placeholder location=“classpath:jdbc.properties”/>


Dao层

===================================================================

EmployeeDao类:

@Repository

public class EmployeeDao {

@Autowired //按照类型注入

JdbcTemplate jdbcTemplate;

//保存员工信息到数据库

public void save( Employee employee)

{

String sql=“insert employee values(?,?,?,?,?)”;

jdbcTemplate.update(sql,employee.getId(),employee.getName(),employee.getDepartment(),

employee.getEamil(),employee.getGender());

}

//查询并返回对应员工信息

public Employee exist(Employee employee)

{

String sql=“select * from employee where name=? and id= ?”;

try{

Employee employee1 = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper(Employee.class), employee.getName(), employee.getId());

return employee1;

}

catch (Exception e)

{

return null;

}

}

//删除某个员工的信息

public void delete(Employee employee)

{

String sql=“delete from employee where id=?”;

jdbcTemplate.update(sql,employee.getId());

}

//返回所有员工的信息

public List getAllEmployees()

{

String sql=“select* from employee”;

List list = jdbcTemplate.query(sql, new BeanPropertyRowMapper(Employee.class));

return list;

}

}


POJO—自定义对象层

==========================================================================

employee类:

@Component

public class Employee {

private Integer id;

private String name;

private String department;

private String eamil;

private Integer gender;

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 getDepartment() {

return department;

}

public void setDepartment(String department) {

this.department = department;

}

public String getEamil() {

return eamil;

}

public void setEamil(String eamil) {

this.eamil = eamil;

}

public Integer getGender() {

return gender;

}

public void setGender(Integer gender) {

this.gender = gender;

}

@Override

public String toString() {

return “Employee{” +

“id=” + id +

“, name='” + name + ‘’’ +

“, department='” + department + ‘’’ +

“, eamil='” + eamil + ‘’’ +

“, gender=” + gender +

‘}’;

}

}


展示所有员工的界面设计思路

============================================================================

访问index.jsp---->直接发送/emps请求----->控制器查询所有员工-------->放在请求域中-------->转发到list页面进行展示

index.jsp:

<%@ page contentType=“text/html;charset=UTF-8” language=“java” %>

<%–访问页面就直接展示员工列表页面–%>

<jsp:forward page=“/emps”></jsp:forward>

EmployeeController类:

@Controller

public class EmployeeController {

@Autowired

EmployeeDao employeeDao;

@RequestMapping(“/emps”)

public String getEmps(Model model)

{

List all = employeeDao.getAllEmployees();

for(Employee employee:all)

System.out.println(employee);

System.out.println(“当前方法调用一次”);

model.addAttribute(“employees”,all);

return “list”;

}

}

list.jsp:

<%@ page contentType=“text/html;charset=UTF-8” language=“java” %>

<%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>

员工展示页面

<%–cellpadding标签属性:设定单元边沿与单元内容之间的间距–%>

<%–cellspacing 标签属性:设定单元格之间的间距–%>

<%–

private Integer id;

private String name;

private String department;

private String eamil;

private String gender;–%>

员工ID 员工姓名 员工部门 员工邮箱 员工性别 修改 删除

<c:forEach items=“${employees}” var=“emp”>

<%-- 取出容器中的值–%>

${emp.id} ${emp.name} ${emp.department} ${emp.eamil} ${emp.gender==0?"女":"男"} 修改 删除

</c:forEach>

在这里插入图片描述


添加员工

===================================================================

在这里插入图片描述

EmployeeController类新增方法:

/从数据库中查询出所有部门信息/

@RequestMapping(“/toAddPage”)

public String toAddPage(Model model)

{

List all = employeeDao.getAllEmployees();

List departName = new LinkedList();

for(Employee employee:all)

{

departName.add(employee.getDepartment());

}

model.addAttribute(“departments”,departName);

return “addPage”;

}

addPage.jsp

<%@ page contentType=“text/html;charset=UTF-8” language=“java” %>

<%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>

员工添加页面

添加员工

员工id:

姓名:

邮箱:

性别:    男

  女

请选择员工所在部门:

<c:forEach items=“${departments}” var=“dept”>

${dept}

</c:forEach>

在这里插入图片描述


Spring表单标签技术


在这里插入图片描述

需要在最上面导入Spring提供的标签库

<%@ taglib prefix=“form” uri=“http://www.springframework.org/tags/form” %>

好处

通过SpringMVC的表单标签可以实现将模型数据中的属性和HTML表单元素相绑定

以实现表单数据更便捷编辑和表单值的回显

spring标签库,替换上面的html写的form表单

form:form

<%–

path就是原来html----input标签里面的name项,即提交得到的key

path的作用:

1.当做原生的name项

2.自动回显隐含模型中某个对象对应的这个属性的值

–%>

员工id:<form:input path=“id”/>

姓名:<form:input path=“name”/>

邮箱:<form:input path=“eamil”/>

性别:

男:<form:radiobutton path=“gender” value=“1”/>

女:<form:radiobutton path=“gender” value=“0”/>

请选择员工所在的部门:

<%–items:指定要遍历的集合,自动遍历

如果遍历出来的是一个自定义对象

itemLabel=“属性名”: 指定遍历出来的这个对象的哪个属性是作为optiob标签体的值—>在页面显示要选择的选项里面显示的内容

itemValue=“属性名”:指定刚才遍历出来的这个对象的哪个属性是作为要提交的value值–%>

<form:select path=“department” items=“${departments}”/>


<%–原生的html标签和spring标签混合使用–%>

</form:form>

注意:SpringMVC认为,表单数据中的每一项最终都是要回显的
path指定的是一个属性,这个属性是从隐含模型(请求域)中取出的某个对象中的属性
path指定的每一个属性,请求域中必须有一个对象,拥有这个属性
这个对象就是请求域中的command的值,没有就报错,错误如下:

在这里插入图片描述


在隐含模型中放入command对象

EmployeeController类:

/从数据库中查询出所有部门信息/

@RequestMapping(“/toAddPage”)

public String toAddPage(Model model)

{

List all = employeeDao.getAllEmployees();

List departName = new LinkedList();

for(Employee employee:all)

{

departName.add(employee.getDepartment());

}

model.addAttribute(“departments”,departName);

/在隐含模型中放入一个command对象/

model.addAttribute(“command”,new Employee());

return “addPage”;

}

addPages.jsp:

form:form

<%–

path就是原来html----input标签里面的name项,即提交得到的key

path的作用:

1.当做原生的name项

2.自动回显隐含模型中某个对象对应的这个属性的值

–%>

员工id:<form:input path=“id”/>

姓名:<form:input path=“name”/>

邮箱:<form:input path=“eamil”/>

性别:

男:<form:radiobutton path=“gender” value=“1”/>

女:<form:radiobutton path=“gender” value=“0”/>

请选择员工所在的部门:

<%–items:指定要遍历的集合,自动遍历

如果遍历出来的是一个自定义对象

itemLabel=“属性名”: 指定遍历出来的这个对象的哪个属性是作为optiob标签体的值—>在页面显示要选择的选项里面显示的内容

itemValue=“属性名”:指定刚才遍历出来的这个对象的哪个属性是作为要提交的value值–%>

<form:select path=“department” items=“${departments}”/>


<%–原生的html标签和spring标签混合使用–%>

</form:form>

在这里插入图片描述


以前我们表单标签会从请求域中获取一个command对象,把这个对象中每一个属性对应的显示在页面上

可以告诉SpringMVC不要去取command的值了,我放了一个modelAttribute指定的值,取对象用的key就使用我modelAttribute指定的

演示:

EmployeeController类:

/从数据库中查询出所有部门信息/

@RequestMapping(“/toAddPage”)

public String toAddPage(Model model)

{

List all = employeeDao.getAllEmployees();

List departName = new LinkedList();

for(Employee employee:all)

{

departName.add(employee.getDepartment());

}

model.addAttribute(“departments”,departName);

/在隐含模型中放入一个employee对象/

model.addAttribute(“employee”,new Employee(null,“超级大忽悠”,“空军部”,“@307667”,1));

return “addPage”;

}

addPage.jsp

<form:form modelAttribute=“employee”>

<%–

path就是原来html----input标签里面的name项,即提交得到的key

path的作用:

1.当做原生的name项

2.自动回显隐含模型中某个对象对应的这个属性的值

–%>

员工id:<form:input path=“id”/>

姓名:<form:input path=“name”/>

邮箱:<form:input path=“eamil”/>

性别:

男:<form:radiobutton path=“gender” value=“1”/>

女:<form:radiobutton path=“gender” value=“0”/>

请选择员工所在的部门:

<%–items:指定要遍历的集合,自动遍历

如果遍历出来的是一个自定义对象

itemLabel=“属性名”: 指定遍历出来的这个对象的哪个属性是作为optiob标签体的值—>在页面显示要选择的选项里面显示的内容

itemValue=“属性名”:指定刚才遍历出来的这个对象的哪个属性是作为要提交的value值–%>

<form:select path=“department” items=“${departments}”/>


<%–原生的html标签和spring标签混合使用–%>

</form:form>

在这里插入图片描述


点击提交按钮,对数据进行保存


以后jsp页面什么form表单的action提交路径,a标签的herf属性都写绝对路径,因此需要先获取项目根路径

//将当前项目的根路径存储再pageContext域中

<%pageContext.setAttribute(“ctp”,request.getContextPath());%>

<form:form modelAttribute=“employee” action=“${ctp}/emp” method=“post”>

处理表单提交请求的方法

//只接收Post请求

@RequestMapping(value = “/emp”,method = RequestMethod.POST)

public String addEmp(Employee employee)//这里会自动赋值

{

System.out.println(“要添加的员工信息:”+employee);

employeeDao.save(employee);

//返回列表页面,直接重定向到查询所有员工的请求

return “redirect:/emps”;

}

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


修改员工

===================================================================

注意:被@ModelAttribute注解的方法会在所有的controller方法执行之前执行,即每一个controller方法执行之前,都会执行该方法


被@ModelAttribute注解的方法和目标controller方法用的都是一套的resolve方法,因此目标方法里面能写什么,获取什么,注解方法里面也能写和获取对应的内容


在这里插入图片描述

在EmployeeDao类中新增一个按照id查找对应员工的方法:

//按照员工的id查找对应的员工

public Employee getEmpById(Integer id)

{

String sql=“select * from employee where id= ?”;

try{

Employee employee1 = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper(Employee.class),id);

return employee1;

}

catch (Exception e)

{

return null;

}

}

EmployeeController类:按照id查询对应的员工

@RequestMapping(“/emp/{id}”)

public String getEmp(@PathVariable(“id”)Integer id,Model model)

{

//1.按照对应id去数据库中查出对应的员工信息

Employee emp = employeeDao.getEmpById(id);

//2.放在隐含模型中

model.addAttribute(“EditEmp”,emp);

//3.全部的部门信息放到隐含模型中,是为了可以在下拉框中修改部门信息

List all = employeeDao.getAllEmployees();

List departName = new LinkedList();

for(Employee employee:all)

{

departName.add(employee.getDepartment());

}

model.addAttribute(“departments”,departName);

return “edit”;

}

UpdateEmp方法:修改员工的方法,只有put请求才会接收

modelAttributes方法:取出数据库中的对应对象,在该对象的基础上进行修改,而不是新建一个对象

/*虽然上面也有/emp/{id}的请求路径方式,但是没有限制请求方式,而下面我们限制了请求方式

优先精确匹配*/

/修改员工的方法,只有put请求才会接收/

@RequestMapping(value = “/emp/{id}”,method = RequestMethod.PUT)

//在从数据库取出来的对象数据的基础上进行修改

public String UpdateEmp(@ModelAttribute(“employee”) Employee employee)

{

System.out.println(“要修改的员工:”+employee);

//调用数据库中修改对象数据的方法,员工的id是不变的

employeeDao.UpdateEmp(employee);

return “redirect:/emps”;

}

@ModelAttribute

/从请求参数中拿到id/

public void modelAttributes(@RequestParam(value = “id”,required = false)Integer id,Model model)

{

if(id!=null)

{

Employee emp = employeeDao.getEmpById(id);

model.addAttribute(“employee”,emp);

}

System.out.println(“提前运行的方法调用了”);

}

edit.jsp

<%@ page contentType=“text/html;charset=UTF-8” language=“java” %>

<%@ taglib prefix=“form” uri=“http://www.springframework.org/tags/form” %>

员工修改页面

员工信息修改

<% pageContext.setAttribute(“ctp”,request.getContextPath());%>

<%–modelAttribute:这个表单的所有内容显示绑定的是请求域中EditEmp的值–%>

<form:form action=“ c t p / e m p / {ctp}/emp/ ctp/emp/{EditEmp.id}”

modelAttribute=“EditEmp”

method=“post”>

<%–put---->对应Rest风格的更新请求,这里hiiden是为了不在页面上显示处理,隐藏数据–%>

<%–员工id不能修改,可以采用隐藏数据的模式,但是不安全–%>

姓名:<form:input path=“name”/>

邮箱:<form:input path=“eamil”/>

性别:

男:<form:radiobutton path=“gender” value=“1”/>

女:<form:radiobutton path=“gender” value=“0”/>

请选择员工所在的部门:

<form:select path=“department” items=“${departments}”/>


</form:form>

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

这里逻辑有一个小bug,部门的种类应该单独创建一个类,而不是按照扫描当前数据库所有员工获取所有的部门种类,这里懒的改了


删除功能实现

=====================================================================

在这里插入图片描述

list.jsp:

<%@ page contentType=“text/html;charset=UTF-8” language=“java” %>

<%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>

员工展示页面

<% pageContext.setAttribute(“ctp”,request.getContextPath());%>

<%–cellpadding标签属性:设定单元边沿与单元内容之间的间距–%>

<%–cellspacing 标签属性:设定单元格之间的间距–%>

员工ID 员工姓名 员工部门 员工邮箱 员工性别 修改 删除

<c:forEach items=“${employees}” var=“emp”>

<%-- 取出容器中的值–%>

${emp.id} ${emp.name} ${emp.department} ${emp.eamil} ${emp.gender==0?"女":"男"} 修改

</c:forEach>

添加员工

deleteEmp方法:负责删除员工

//删除方法

@RequestMapping(value = “/emp/{id}”,method = RequestMethod.DELETE)

public String deleteEmp(@PathVariable(“id”) Integer id)

{

employeeDao.delete(id);

return “redirect:/emps”;

}

在这里插入图片描述


最终完整源码呈现

=======================================================================

目录结构


在这里插入图片描述

web.xml


<?xml version="1.0" encoding="UTF-8"?>

<web-app version=“2.4”

xmlns=“http://java.sun.com/xml/ns/j2ee”

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

xsi:schemaLocation=“http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd”>

DispatcherServlet

org.springframework.web.servlet.DispatcherServlet

最后

针对最近很多人都在面试,我这边也整理了相当多的面试专题资料,也有其他大厂的面经。希望可以帮助到大家。

image

上述的面试题答案都整理成文档笔记。 也还整理了一些面试资料&最新2021收集的一些大厂的面试真题(都整理成文档,小部分截图)

image

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

employeeDao.delete(id);

return “redirect:/emps”;

}

在这里插入图片描述


最终完整源码呈现

=======================================================================

目录结构


在这里插入图片描述

web.xml


<?xml version="1.0" encoding="UTF-8"?>

<web-app version=“2.4”

xmlns=“http://java.sun.com/xml/ns/j2ee”

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

xsi:schemaLocation=“http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd”>

DispatcherServlet

org.springframework.web.servlet.DispatcherServlet

最后

针对最近很多人都在面试,我这边也整理了相当多的面试专题资料,也有其他大厂的面经。希望可以帮助到大家。

[外链图片转存中…(img-jbj1qRIE-1715584053971)]

上述的面试题答案都整理成文档笔记。 也还整理了一些面试资料&最新2021收集的一些大厂的面试真题(都整理成文档,小部分截图)

[外链图片转存中…(img-tNT9BeBy-1715584053971)]

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 30
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值