前言
- 时间:2021.7.19
- 内容:直接看底下吧,学一天也不晓得自己学了个啥555,仿佛是工具之类的,一直在配置。
- 备注:这次没有上图片了,都是文字喔~
操作
1 新建模块
- GroupId:spring
- ArtifactId:spring-param
2 初始目录
- src
- main
- java
- resources
- test
- java
- pom.xml
- spring-param.xml
3 配置pom.xml
<?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>spring</groupId>
<artifactId>spring-param</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 用war打包 -->
<packaging>war</packaging>
<!-- 使用阿里服务器 -->
<repositories>
<repository>
<id>aliyun</id>
<name>aliyun</name>
<url>https://maven.aliyun.com/repository/public</url>
</repository>
</repositories>
<!-- 依赖导包 -->
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
</dependencies>
</project>
4 新增目录
-
在main下方新建webapp,webapp下新增WEB-INF
-
在structure里新增web.xml,把上面的文件路径指定到WEB-INF下,并在WEB-INF后面加上web.xml(应用后,这个目录下自动会生成一个web.xml);下面那个文件路径直接配到webapp即可,一般都是正确的。
E:\workspace_Java\idea\java_web\class1\210712\spring-param\src\main\webapp\WEB-INF\web.xml
5 配置web.xml
根据爆红,去爆红的地点src–>main–>resources下新建一个applicationContext.xml文件。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 如果不配置这个参数,则需要在WEB-INF下面新建mvc-servlet.cml -->
<!-- 我们希望统一存放配置文件到resources中,所以要在这里配置一下 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
6 新建applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
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">
</beans>
7 在java包下新建控制器
- alert+insert快捷键,新建包com.pro.controller.ParamController.java
- 在ParamController.java类前面加上@Controller,会自动导包(import org.springframework.stereotype.Controller;)
- 写一个测试方法
package com.pro.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @author Yuhua
* @since 21.7.19 10:01
*/
@Controller
public class ParamController {
@RequestMapping("/param1")
public String param1(String userName){
return "hello"+userName;
}
}
8 配置tomcat
- 新建一个本地(local)的tomcat server
- 给这个服务器重命名
- 在Deployment里会有警告Warning( No artifacts marked for deployment)
- 点击fixed半自动增加一个spring-param-war-exploded
- 为了方便,把Deployment下的Application Context路径删减成项目名(前面的URL会联动更新)
- 为了方便,把On’Update’action设置为Redeploy,把On frame deactivation设置为Update classes and resources
- Apply之后可以开始debug
9 跑起tomcat测试,更新配置文件
- 此时会找不到路径,因为没有配置路径,现在到applicationContext.xml里配置前缀后缀,更新。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
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">
<bean class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
- 由于这里用到了jstl的东西,所以需要回到web.xml,加上jsp、jstl的包,更新。
<!-- json -->
<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-databind</artifactId>
<version>2.9.9</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.0</version>
</dependency>
10 前端配合测试代码
-
直接看今日代码好了,更新太多次啦~
-
新建com.pro.domain.Student.java
- private Integer stuId;
- private String stuName;
- private Integer age;
11 零碎知识点
1 关于json
- json就是名值对
[
{
"name":"zs"
"age":"22"
"sex":"男"
"ah":["aa","bb","cc"]
},
{
"name":"zs"
"age":"22"
"sex":"男"
"ah":["aa","bb","cc"]
}
]
- 到pom.xml里配置导入json的包,更新pom.xml
<!-- json -->
<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-databind</artifactId>
<version>2.9.9</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.0</version>
</dependency>
2 @RequestParam(value = “userName”,defaultValue = “no data”,required = false)
数组前面必须要加@RequestParam
当必须要传参时,required设置为默认的true;当可以不传参时,required设置为false。
这里我尝试的时候,由于jsp里的userName和Controller里的name名字不同时,required的值无论是什么值,都会报404。
比较常用的是以下的两种方法。
<a href="xx?userName=aa">url</a>
<a href="xx">url</a>
3 param1aa.jsp在webapp和WEB-INF-jsp下都存在时候,会调用哪个?
会调用webapp下的那个。
4 @ResponseBody的作用
加了这句话之前,返回的是地址中间缺的那部分,加了之后,只是返回json之类的数据。
5 对象中包含对象可以操作主键外键
-
在Student.java里加入:private Clazz clazz;
-
在jsp中用这个调用:
6 日期格式化(面试题)
-
可以在Student.java里加入这个
@DateTimeFormat(pattern = "yyyy-MM-dd"); private Date createDate;
-
也可以在ParamController.java里加入这个
public Object param9(String stuName,@DateTimeFormat(pattern = "yyyy-MM-dd") Date createDate){ System.out.println("createDate:"+createDate); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); sdf.format(createDate); return createDate; }
-
还可以单独建立MyDateConverter.java来实现
注意要到application里加入一个bean:FormattingConversionServiceFactoryBean
<context:component-scan base-package="com.pro" /> <!-- 使用注解 --> <mvc:annotation-driven conversion-service="conversionService2"/> <!-- 静态资源,使用tomcat的默认servlet来处理 --> <mvc:default-servlet-handler/> <!-- 自定义的转换类,写在这里 --> <bean id="conversionService2" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property name="converters"> <set> <bean class="com.pro.converter.MyDateConverter" /> </set> </property> </bean>
7 中文乱码(面试题)
tomcat8.0以上conf–>server.xml自动有,以下没有,要自己加URIcoding=“UTF-8”
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIcoding="UTF-8" />
以debug来看,为什么get方式的不乱,post方式的反而乱了呢?
在web.xml里配置过滤器
<filter>
<filter-name>myCharFilter</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>myCharFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
此时debug出来,post方法在Controller里不乱码啦,但页面显示了乱码,说明提交正确,但是返回时候乱码了。
再配置applicationContext.xml
<mvc:annotation-driven conversion-service="conversionService2">
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<!-- 相应给客户端的内容的编码设置 -->
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=utf-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
四种提交方式
POST,GET,HEAD,PATCH
int和Integer的区别
int 不能强转String类型的数据,能强转double类型。
Integer能强转String类型的数据。
Integer可以用它的方法来判断它是不是空的,但是int只是个值,没有方法。
今日代码
pom.xml
<?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>spring</groupId>
<artifactId>spring-param</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 用war打包 -->
<packaging>war</packaging>
<!-- 使用阿里服务器 -->
<repositories>
<repository>
<id>aliyun</id>
<name>aliyun</name>
<url>https://maven.aliyun.com/repository/public</url>
</repository>
</repositories>
<!-- 依赖导包 -->
<dependencies>
<!-- webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
<!-- jsp -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
</dependency>
<!-- jstl -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- json -->
<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-databind</artifactId>
<version>2.9.9</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.0</version>
</dependency>
</dependencies>
</project>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<filter>
<filter-name>myCharFilter</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>myCharFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 如果不配置这个参数,则需要在WEB-INF下面新建mvc-servlet.cml -->
<!-- 我们希望统一存放配置文件到resources中,所以要在这里配置一下 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
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">
<context:component-scan base-package="com.pro" />
<!-- 使用注解 -->
<mvc:annotation-driven conversion-service="conversionService2"/>
<!-- 静态资源,使用tomcat的默认servlet来处理 -->
<mvc:default-servlet-handler/>
<mvc:annotation-driven conversion-service="conversionService2">
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<!-- 相应给客户端的内容的编码设置 -->
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=utf-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
<!-- 自定义的转换类,写在这里 -->
<bean id="conversionService2" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="com.pro.converter.MyDateConverter" />
</set>
</property>
</bean>
<bean class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
param1aa.jsp
<%--
Created by IntelliJ IDEA.
User: Yuhua
Date: 21.7.19
Time: 10:25
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
webapp下,param1aa.jsp <br>
aa:${aa} <br>
<hr>name一致:<br>
<form action="param1" method="post">
<input type="text" name="userName">
<input type="submit" name="确定">
</form>
<hr>name不一致:<br>
<form action="param2" method="post">
<input type="text" name="userName">
<input type="submit" name="确定">
</form>
<hr>数组:<br>
<form action="param3" method="post">
<input type="text" name="name"><br>
<input type="checkbox" name="ah" value="1">1<br>
<input type="checkbox" name="ah" value="2">2<br>
<input type="checkbox" name="ah" value="3">3<br>
<input type="submit" value="确定">
</form>
<hr>复选->集合:<br>
<form action="param4" method="post">
<input type="text" name="userName"><br>
<input type="checkbox" name="ah" value="1">1<br>
<input type="checkbox" name="ah" value="2">2<br>
<input type="checkbox" name="ah" value="3">3<br>
<input type="submit" value="确定">
</form>
<hr>对象:<br>
<form action="param5" method="post">
<input type="text" name="stuId"><br>
<input type="text" name="stuName"><br>
<input type="text" name="age"><br>
<input type="submit" value="确定">
</form>
<hr>对象中包含数组:<br>
<form action="param6" method="post">
<input type="text" name="stuId"><br>
<input type="text" name="stuName"><br>
<input type="text" name="age"><br>
<input type="checkbox" name="ch" value="1">1<br>
<input type="checkbox" name="ch" value="2">2<br>
<input type="checkbox" name="ch" value="3">3<br>
<input type="submit" value="确定">
</form>
<hr>对象中包含数组,提交为map:<br>
<form action="param7" method="post">
<input type="text" name="stuId"><br>
<input type="text" name="stuName"><br>
<input type="text" name="age"><br>
<input type="checkbox" name="ch" value="1">1<br>
<input type="checkbox" name="ch" value="2">2<br>
<input type="checkbox" name="ch" value="3">3<br>
<input type="submit" value="确定" />
</form>
<hr>对象中包含对象:<br>
<form action="param8" method="post">
<input type="text" name="stuId"><br>
<input type="text" name="stuName"><br>
<input type="text" name="age"><br>
<input type="text" name="clazz.classId"><br>
<input type="text" name="clazz.className"><br>
<input type="submit" value="确定" />
</form>
<hr>日期:<br>
<form action="param9" method="post">
<input type="text" name="stuName"><br>
<input type="text" name="createDate"><br>
<input type="submit" value="确定" />
</form>
<hr>自定义转化类:<br>
<form action="param10" method="post">
<input type="text" name="stuName"><br>
<input type="text" name="createDate"><br>
<input type="submit" value="确定" />
</form>
<%--有四种方式提交post get push--%>
<hr>get方式提交,是否是乱码:<br>
<form action="param11" method="get">
<input type="text" name="stuName"><br>
<input type="submit" value="确定" />
</form>
<hr>post方式提交,是否是乱码:<br>
<form action="param12" method="post">
<input type="text" name="stuName"><br>
<input type="submit" value="确定" />
</form>
</body>
</html>
ParamController.java
package com.pro.controller;
import com.pro.converter.MyDateConverter;
import com.pro.domain.Student;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* @author Yuhua
* @since 21.7.19 10:01
*/
@Controller
public class ParamController {
@RequestMapping("/param1")
@ResponseBody //返回字符串,json.xml等格式的数据
public String param1(String userName, ModelMap modelMap){
modelMap.addAttribute("aa","aa");
return "param1"+userName;
}
@RequestMapping("/param2")
@ResponseBody //返回字符串,json.xml等格式的数据
public String param2(@RequestParam(value = "userName",defaultValue = "no data",required = false) String name){
return "param2:"+name;
}
@RequestMapping("/param3")
@ResponseBody //返回字符串,json.xml等格式的数据
public String param3(@RequestParam(required = false) String name,String[] ah){
//System.out.println("name:"+name);
for (int i = 0; i < ah.length; i++) {
//System.out.println("a["+i+"]:"+ah[i]);
}
return "param3:"+ah;
}
@RequestMapping("/param4")
@ResponseBody //返回字符串,json.xml等格式的数据
public String param4(String userName, @RequestParam List<String> ah){
//System.out.println("list:"+ah);
return "param4:"+ah;
}
@RequestMapping("/param5")
@ResponseBody //返回字符串,json.xml等格式的数据
public Object param5(Student student){
//System.out.println("student:"+student);
return student;
}
@RequestMapping("/param6")
@ResponseBody //返回字符串,json.xml等格式的数据
public Object param6(Student student){
//System.out.println("student:"+student);
return student;
}
@RequestMapping("/param7")
@ResponseBody
public Object param7(@RequestParam Map map){
return map;
//如果是map,不要使用复合数据
}
@RequestMapping("/param8")
@ResponseBody
public Object param8(Student student){
//System.out.println("student:"+student);
return student;
}
@RequestMapping("/param9")
@ResponseBody
public Object param9(String stuName,@DateTimeFormat(pattern = "yyyy-MM-dd") Date createDate){
//System.out.println("createDate:"+createDate);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
sdf.format(createDate);
return createDate;
}
@RequestMapping("/param10")
@ResponseBody
public Object param10(String stuName,Date createDate){
// MyDateConverter myDateConverter = new MyDateConverter();
//Date date = myDateConverter.convert(createDate);
//System.out.println("createDate:"+createDate);
return createDate;
}
@RequestMapping("/param11")
@ResponseBody
public Object param11(String stuName){
System.out.println("stuName:"+stuName);
return stuName;
}
@RequestMapping("/param12")
@ResponseBody
public Object param12(String stuName){
System.out.println("stuName:"+stuName);
return stuName;
}
}
MyDateConverter.java
package com.pro.converter;
import org.springframework.core.convert.converter.Converter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @author Yuhua
* @since 21.7.19 15:26
*/
//自定义的日期转换类
public class MyDateConverter implements Converter<String, Date> {
public Date convert(String s) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
Date date = sdf.parse(s);
return date;
} catch (ParseException e) {
e.printStackTrace();
return null;
}
}
}
Clazz.java
package com.pro.domain;
/**
* @author Yuhua
* @since 21.7.19 14:32
*/
public class Clazz {
private int classId;
private String className;
public int getClassId() {
return classId;
}
public void setClassId(int classId) {
this.classId = classId;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
}
Student.java
package com.pro.domain;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
* @author Yuhua
* @since 21.7.19 11:27
*/
public class Student {
private Integer stuId;
private String stuName;
private Integer age;
//@DateTimeFormat(pattern = "yyyy-MM-dd");
//private Date createDate;
private Clazz clazz;
// private String [] ch;
public Student() {
}
public Student(Integer stuId, String stuName, Integer age) {
this.stuId = stuId;
this.stuName = stuName;
this.age = age;
}
public Integer getStuId() {
return stuId;
}
public void setStuId(Integer stuId) {
this.stuId = stuId;
}
public String getStuName() {
return stuName;
}
public void setStuName(String stuName) {
this.stuName = stuName;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
// public String[] getCh() {
// return ch;
// }
//
// public void setCh(String[] ch) {
// this.ch = ch;
// }
public Clazz getClazz() {
return clazz;
}
public void setClazz(Clazz clazz) {
this.clazz = clazz;
}
}