本次练习基于教材,实现教材案例9-3
1.创建项目并添加jar包(环境配置)
(1)创建动态的web项目
不要直接finish,点击next,在最后一个界面勾选Generatexxx自动生成web.xml后再finish
(2)导入对应jar包
下载教材源码,将对应案例的lib文件夹下的所有jar包粘贴到当前新建文件夹下,由于使用了JSTL表达式,还需要导入JSTL相关jar包,具体可以从how2j上下载
(3)创建jsp文件夹收录jsp文件
2.配置两个xml文件(web.xml与SpringMVC.xml)
(1)web.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 定义一个web应用 -->
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<!-- 定义欢迎页面 -->
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- 定义SpringMVC的servlet -->
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 初始化参数,指定SpringMVC的配置文件位置 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/SpringMVC.xml</param-value>
</init-param>
</servlet>
<!-- 将SpringMVC的servlet映射到根路径 -->
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
(2)SpringMVC.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
<!-- 处理器映射器 -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!-- 处理器适配器 -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
</bean>
<!-- 将一个名为"/getAllUser"的请求映射到一个名为"UsersController"的控制器类上 -->
<bean name="/getAllUser" class="com.mr.controller.UsersController"/>
</beans>
(3)目的
- 通过第一个文件的前端控制器“DispatcherServlet”将所有请求拦截到特定的将要被SpringMVC处理的servlet上;
- 通过第二个文件处理器映射器、处理器适配器、视图解析器等,接收、解析、传递请求。
(4)小结:
(1)关于SpringMVC.xml
在SpringMVC框架中,SpringMVC.xml是用来配置和管理SpringMVC相关组件的配置文件。它包含了如下几个方面的配置:
处理器映射器(Handler Mapping):用于将请求映射到相应的处理器(Controller)。
处理器适配器(Handler Adapter):用于将请求传递给相应的处理器(Controller)进行处理。
视图解析器(View Resolver):用于将处理器(Controller)处理后返回的逻辑视图名解析为物理视图名。
静态资源处理器(Resource Handler):用于处理静态资源(如图片、CSS、JS等)的请求。
拦截器(Interceptor):用于拦截请求并进行相应的处理(如权限控制、日志记录等)。
异常处理器(Exception Handler):用于处理请求处理过程中出现的异常。
(2)课本的web.xml与how2j上的略有不同,课本上通过标签,自定义指向要使用的配置文件,
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/SpringMVC.xml</param-value>
</init-param>
<!-- 使用WEB-INF下的SpringMVC.xml-->
而how2j则使用web.xml的默认规则,自动寻找springmvc-servlet.xml
。
3.MVC标配:
(1)M:
在src下new一个class,包名与类名的填写如图示:
代码:
package com.mr.entity;
public class Users {
private String name;
private int age;
private String tel;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
}
(2)V
在WEB-INF的jsp文件夹,new一个jsp文件,取名为“usersList.jsp”,代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%> <%@ taglib prefix="c"
uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Insert title here</title>
</head>
<body>
<table>
<Tr>
<td>姓名</td>
<td>年龄</td>
<td>电话</td>
</Tr>
<c:forEach items="${listU }" var="list">
<tr>
<td>${list.name }</td>
<td>${list.age }</td>
<td>${list.tel }</td>
</tr>
</c:forEach>
</table>
</body>
</html>
(3)C
在src下new一个servlet,包名和类名如图示:
代码:
package com.mr.controller;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import com.mr.entity.Users;
public class UsersController implements Controller {
// 实现Controller接口的handleRequest方法
@Override
public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
// TODO Auto-generated method stub
// 调用模拟的Service方法获取数据
List<Users> listU = UsersService();
// 创建ModelAndView对象
ModelAndView mav = new ModelAndView();
// 将数据添加到ModelAndView对象中
mav.addObject("listU",listU);
// 设置视图名称
mav.setViewName("/WEB-INF/jsp/usersList.jsp");
// 返回ModelAndView对象
return mav;
}
// 模拟Service的内部类
public List<Users> UsersService(){
// 创建一个空的List对象
List<Users> list = new ArrayList<>();
// 创建一个Users对象,并设置属性
Users u = new Users();
u.setName("小鸟");
u.setAge(1);
u.setTel("20230511");
// 创建另一个Users对象,并设置属性
Users u1 = new Users();
u1.setName("小小鸟");
u1.setAge(2);
u1.setTel("20230512");
// 将两个Users对象添加到List中
list.add(u);
list.add(u1);
// 返回List对象
return list;
}
}
4.运行:
(1)运行此前创建的任意一个文件,将当前项目添加到服务器上后
(2)访问http://localhost:8080/SpringMVCTest/getAllUser
(3)效果:
5.一点思考:
课本上的代码有一行注释“// 模拟Service的内部类”
类比于上上上周的HeroList案例,我认为这里模拟的就是实现update、add、edit等效果的servlet类,因此有时间的话我想要把这个案例还原为一个完整的有前后端的项目,具体思路如下:
(1)创建JavaDAO包,存储M中用于与数据库连接的类
这里已经创建的entity包就相当于bean包;
(2)将模拟Service类的代码具体化,分开写成多个servlet类;
(3)根据要实现的方法修改视图(jsp文件)。