荐 SpringMvc基础
程序员文章站
2022-04-15 23:21:45
springmvc为表现层框架,基于MVC设计模式,基于组件流程方式执行流程。简化开发。 springmvc执行流程准备:......
springmvc为表现层框架,基于MVC设计模式,基于组件流程方式执行流程。简化开发。
准备:
User 实体类
package xyz.gsdn.domain;
import java.io.Serializable;
import java.util.Date;
public class User implements Serializable
{
private String username;
private int age;
private Date birthday;
Account account;
public String getUsername()
{
return username;
}
public void setUsername(String username)
{
this.username = username;
}
public int getAge()
{
return age;
}
public void setAge(int age)
{
this.age = age;
}
public Date getBirthday()
{
return birthday;
}
public void setBirthday(Date birthday)
{
this.birthday = birthday;
}
public Account getAccount()
{
return account;
}
public void setAccount(Account account)
{
this.account = account;
}
@Override
public String toString()
{
return "User{" +
"username='" + username + '\'' +
", age=" + age +
", birthday=" + birthday +
", account=" + account +
'}';
}
}
Account 实体类(Account作为User的内部属性)
package xyz.gsdn.domain;
import java.io.Serializable;
public class Account implements Serializable
{
private int aid;
private int aage;
@Override
public String toString()
{
return "Account{" +
"aid=" + aid +
", aage=" + aage +
'}';
}
public int getAid()
{
return aid;
}
public void setAid(int aid)
{
this.aid = aid;
}
public int getAage()
{
return aage;
}
public void setAage(int aage)
{
this.aage = aage;
}
}
springmvc主要就负责web层(controller)
UserController.java
@SessionAttributes(value = {"msg","msg2"})//将msg键值对存入session域
@RequestMapping("/user")
@Controller
public class UserController
{
/**
RequestMapping注解:
用于建立请求URL和处理请求方法之间的对应关系。
@RequestMapping(path = "/hello",method = {RequestMethod.POST},params = {"username=321"})
path: 请求路径(可以不写,默认,当不止有一个参数时,得写)
method: 请求方法限制,例现在只接受post请求
params: 传入参数限制.必须传入username且username的参数为321
return String 方法返回一个字符串,根据视图解析器配置,跳转到 字符串.jsp(ok.jsp页面)
*/
@RequestMapping("/chuan")
String chuan(User u){
System.out.println(u);
return "ok";//视图解析器自动转向ok.jsp,详细看spring.mvc的internalResourceViewResolver
}
/**
* 演示,未配置.返回ModelAndView对象
* addObject 返回的数据
* setViewName 跳转的页面名称
* return mv 返回ModelAndView对象,此对象包含返回的数据和跳转的页面
*/
ModelAndView chuanModelView(User u){
ModelAndView mv = new ModelAndView();
mv.addObject("Object对象");//这个地方传入的是Object对象,返回的数据
mv.setViewName("ok");//跳转的页面名称
return mv;
}
// --------------------------------------------------------------------------------------------------------
/**
* 关于session处理的三个方法
* @param model Modelmap是Model的子类
* @param request
* @return
* return String 方法返回一个字符串,根据视图解析器配置,跳转到 字符串.jsp(ok.jsp页面)
*/
@RequestMapping("/setSession")
String setSession(ModelMap model, HttpServletRequest request){
//存储到request域中
//可以在该方法的类名上添加@SessionAttributes将其添加到session域
model.addAttribute("msg","msg_value");
model.addAttribute("msg2","msg_value2");
return "ok";
}
@RequestMapping("/getSession")
String getSession(ModelMap model,HttpServletRequest request){
String msg = (String)model.get("msg");
System.out.println(msg);
//使用HttpServletRequest对象获取session
//此方法有耦合,springmvc中使用 model.addAttribute + @SessionAttributes 替代
HttpSession session = request.getSession();
String msg_request = (String) session.getAttribute("msg");
System.out.println("request打印msg:"+msg_request);
return "ok";
}
/**
* 从request域删除,cong
* @param model
* @param sessionStatus
* @return
*/
@RequestMapping("/delSession")
String delSession(ModelMap model, SessionStatus sessionStatus){
//从request域移除
model.remove("msg");
System.out.println("sessionStatus:"+sessionStatus);
//清除session域
sessionStatus.setComplete();
System.out.println("sessionStatus:"+sessionStatus);
return "ok";
}
// --------------------------------------------------------------------------------------------------------
/**
* 关于ajax异步请求
* ResponseBody将返回参数加入response的返回体,前端就可以接收到
*/
@RequestMapping("/testAjax")
public @ResponseBody User testAjax( User user) {
user.setUsername("23csf");
user.setAge(111);
user.setBirthday(new Date("2000/1/1"));
Account account = new Account();
account.setAid(13);
System.out.println("---------------------------");
System.out.println("UserController.testAjax");
System.out.println(user);
System.out.println(user.getAge());
return user;
}
// --------------------------------------------------------------------------------------------------------
/**
* RequestBody可以获取请求体,直接存入body
* @param body
* void方法会默认跳转到 项目名.jsp (reqBody.jsp)页面
*/
@RequestMapping("reqBody")
void reqBody(@RequestBody String body)
{
System.out.println(body);
}
// --------------------------------------------------------------------------------------------------------
/**
* 文件上传,得在springmvc.xml中配置multipartResolver文件解析器对象
* @param request
* @param upload
* @throws Exception
* void void方法会默认跳转到 项目名.jsp (uploadFile.jsp)页面
*/
@RequestMapping("/uploadFile")
void uploadFile(HttpServletRequest request, MultipartFile upload) throws Exception
{
//tomcat的webapp下项目文件下的根目录
// System.out.println(request.getSession().getServletContext().getRealPath(""));
String path = "C:\\Users\\shen_i\\Desktop/file";//要写入文件的路径
File file = new File(path);
if (!file.exists()){
file.mkdirs();
}
String name = upload.getOriginalFilename();//获取文件名
// 更改文件名为filename "uuid_name"
String filename= UUID.randomUUID().toString().replace("-","") +"_"+ name;
/*上传文件 (文件路径,文件名)*/
upload.transferTo(new File(path,filename));
return;
}
}
index.jsp 页面,进行访问Controller
<%--
Created by IntelliJ IDEA.
User: shen_i
Date: 2020/7/11 0011
Time: 10:08
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>index--跳转ok.jsp</title>
<%-- 导入jquery,用于Ajax--%>
<script src="js/jquery-3.4.1.min.js" ></script>
<script>
$(function ()
{
$("#btn").click(//按钮绑定ajax
function ()
{
//发送post请求,请求路径 user/Ajax
//传过去的参数为username:"kk",age:"99",birthday:"2020-01-01"
//细节:birthday:"2020-01-01" 必须为-连接, /连接无法封装(I don't understand)
// 结果配置了一个转为"/"的converter后,可以封装"2020/01/01,但无法封装"2020-01-01"???
//接着 删除自定义的类型转换器StringToDataConverter(其可以将日期字符串转为2020-01-01)
//就可以封装"2020/01/01",却无法封装"2020-01-01"
$.post("user/testAjax",{"username":"kk","age":"99","birthday":"2020-01-01"},function (data)
{
alert("hello");
$("#ajax_val").css("background-color","#fff");
//显示ajax请求结果
$("#ajax_val").html(data.username +" "+data.age+" "+data.birthday);
});
});
});
</script>
</head>
<body style="background-color:rgb(239, 255, 255)">
<br>
<form action="user/chuan" method="post">
姓名:<input type="text" name="username" />
年龄:<input type="text" name="age" />
日期:<input type="date" name="birthday">
<br>
<%-- User内部属性Account account--%>
<%-- Account 想要自动封装,name名必须为 account.aid ,和Account内部属性名完全相同--%>
Account aid:<input type="text" name="account.aid">
Account aage:<<input type="text" name="account.aage">
<input type="submit" value="提交">
<br> <br>
<hr>
<br>
<%-- 细节:"user/setSession" 前边不要加/,写为"/user/setSession"跳转时会缺失项目名--%>
<a href="user/setSession">/user/setSession</a>
<a href="user/getSession">/user/getSession</a>
<a href="user/delSession">/user/delSession</a>
<input type="text">
</form>
<br>
<hr>
<button id="btn" >Ajax请求</button> 传过去的参数为username:"kk",age:"99",birthday:"2020/01/01"
<br>Ajax请求结果:<br>
<div id="ajax_val">
还没有进行查询...
</div>
<br>
<hr><br>
<form action="user/uploadFile" method="post" enctype="multipart/form-data">
上传文件:<input type="file" name="upload"/>
<br>
<input type="submit" value="提交">
</form>
</body>
</html>
springmvc.xml 主要springmvc配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
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/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">
<!-- 开启注解扫描,将base-package配置的包内的controller加载进容器-->
<context:component-scan base-package="xyz.gsdn.Controller">
</context:component-scan>
<!-- 视图解析器对象-->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀:文件目录-->
<property name="prefix" value="/pages/"/>
<!-- 后缀:文件后缀名-->
<property name="suffix" value=".jsp"/>
</bean>
<!--dispatcherServlet会拦截所有资源,包括静态资源-->
<!-- 此处标记静态资源位置,让其不拦截-->
<!-- location元素:表示webapp目录下(即服务器根目录)的pages包下的所有文件;-->
<!-- mapping元素:表示以/pages开头的所有文件请求路径,如/pages/**-->
<!-- 该配置的作用是:DispatcherServlet不会拦截以/resource开头的所有请求路径,并当作静态资源交由Servlet处理-->
<mvc:resources mapping="/pages/**" location="/pages/"/>
<mvc:resources mapping="/css/**" location="/css/"/>
<mvc:resources mapping="/js/**" location="/js/"/>
<!-- 自定义类型转换器 StringToDataConverter 字符串转Date,2020-01-01 -->
<bean id="conversionServiceFactory" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<!-- 配置自己的utils包下的类型转换器-->
<bean class="xyz.gsdn.utils.StringToDataConverter"/>
</set>
</property>
</bean>
<!-- 文件解析器对象-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="10485760"></property>
</bean>
<!-- 开启注解支持, 自动加载HandlerMapping(处理器映射器),HandleAdapter:(处理器适配器)-->
<!-- conversion-service="conversionServiceFactory" 是自己上边的类型转换器,使其生效-->
<mvc:annotation-driven conversion-service="conversionServiceFactory"/>
</beans>
web.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>springmvc_program</display-name>
<!-- 前端控制器dispatcherServlet-->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 顺便在创建前端控制器时加载配置文件springmvc.xml-->
<init-param>
<param-name>contextConfigLocation</param-name>
<!-- classpath:springmvc.xml表示: 类路径下的springmvc.xml-->
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!-- 使该servlet第一时间加载,1即启动容器就创建.等级有1-10-->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- servlet 使用"/"拦截处理所有请求 -->
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--中文乱码解决,过滤器-->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
StringToDataConverter.java 日期字符串转日期的转换器
package xyz.gsdn.utils;
import org.springframework.core.convert.converter.Converter;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 自定义类型转换器
* String 转为 Date
* String source : "1000-10-10"
* Date pattern:"yyyy-MM-dd"
* Date result:1000-10-10
*
*/
public class StringToDataConverter implements Converter<String,Date>
{
@Override
public Date convert(String source)
{
if (source==null)
{
//传入字符串为空
throw new RuntimeException("StringToDataConverter--传入字符为空~");
}
try
{
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date date =dateFormat.parse(source);
return date;
} catch (Exception e)
{
throw new RuntimeException("StringToDataConverter--转换失败~");
}
}
}
pom.xml maven项目依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>xyz.gsdn</groupId>
<artifactId>springmvc</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<spring.version>5.0.2.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
<!-- jackson:字符串和json互转-->
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.9</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.9</version>
</dependency>
<!-- 文件上传-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
</dependencies>
</project>
代码copy完毕后,tomcat启动即可
本文地址:https://blog.csdn.net/qq_43220949/article/details/107281161