springmvc入门—springmvc的使用(2)
文章目录
springmvc中的注解
- @Controller :说明这是一个控制器,这个注解是通过<context:component-scan />来扫描的。
- @PathVariable(“uid”)Integer id:从请求路径中取值。写在变量类型前。将uid的值注入的id中。
- @RequestMapping :可以出现在类或方法上,若出现在类上,则请求的url为 类上注解的 + 方法上@RequestMapping注解的地址。
- @RequestMapping除了可以使用url映射请求外,还可以使用请求方法、请求参数及请求头映射请求。
- 值:value(请求路径)、method(请求方法)、params(请求参数)、heads(请求头)。
- params:
– param1:表示请求必须包含名为param1的参数。
– !param1:表示请求中不可包含名为param1的参数。
– param1!=hello:表示请求包含名为param1的参数,但值不可以是hello。
– {“param1=hello”,“param2”} :表示请求中必须包含值为hello的参数param1,与任意值的param2。 - 若类上的不写,则url就是方法上@RequestMapping注解的url地址
- REST风格:(Representational State Transfer)资源表现层转化。是当前流行的一中互联网软件架构。特点:清晰、易懂、复合标准、方便扩展。
Resources:资源。网络上的实体。一个URI(统一资源定位符)对应一个资源。
Representation:表现层。把资源具体呈现的形式。txt、html、xml、json、二进制。
State Transfer:状态转化。每个请求表示客户端与服务器的交互过程。HTTP是一个无状态协议,所有状态保存在服务器。so,客户端要操作服务器,需要通过一定手段,使服务器发生“状态转化”。
1. 导入相关依赖包
<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.2.3.RELEASE</spring.version>
</properties>
<dependencies>
<!-- spring的依赖包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- json包 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.8</version>
</dependency>
<!-- servlet 和 jsp -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.0</version>
<scope>provided</scope>
</dependency>
</properties>
2. 配置web.xml
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 配置請求的分發器 -->
<servlet>
<servlet-name>DispathcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param> <!-- 初始化参数 -->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispathcherServlet</servlet-name>
<!--/*会拦截所有页面,会导致jsp页面显示代码,但/不会拦截*.jsp这样的页面 -->
<url-pattern>/</url-pattern>
</servlet-mapping>
index.html页面与项目目录结构
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1> <a href="demo/find1">FIND1 no param</a> </h1>
<h1> <a href="demo/find1?usid=1001">FIND1 usid=1001</a> </h1>
<h1> <a href="demo/find2">FIND2</a> </h1>
<h1> <a href="demo/find3/1001/huathy">FIND3 1001 huathy</a> </h1>
<hr/>
<h1> <a href="test1">TEST1</a> </h1>
<h1> <a href="test2">TEST2</a> </h1>
<h1> <a href="index1.html">INDEX1</a> </h1>
<h1> <a href="index2">INDEX2</a> </h1>
<hr>
<h1> <a href="json1">JSON1</a> </h1>
<h1> <a href="json2">JSON2</a> </h1>
<h1> <a href="json3">JSON3</a> </h1>
</body>
</html>
目录结构与其他子页面
4. 返回地址的案例
4-1. DemoController.java
@Controller
@RequestMapping("/demo")
public class DemoController {
/**
* 此时该方法返回值回当作视图地址
* @param usid
* @return
*/
@RequestMapping("/find1")
public String find1(Integer usid){
System.out.println(usid);
//默认回使用内部转发跳转地址,若加上redirect会使用重定向跳转页面
//若视图地址以“/”开头,则表示采用相对于项目开始的“绝对路径”。即这个路径从项目开始算。
//若不以“/”开头,则说明采用相对于请求地址的相对路径。即以地址栏中的请求为起点。
return "redirect:/back/find1.html";
}
@RequestMapping(value="/find2")
public String find2(){
return "find2"; //这种写法需要在spirngmvc.xml中<!-- 配置视图信息 -->
}
//要求使用GET请求方式,地址栏携带参数
@RequestMapping(method=RequestMethod.GET,value="/find3/{uid}/{uname}")
public String find3(@PathVariable("uid")Integer id,@PathVariable("uname")String uname){
System.out.println( id +"\t"+ uname );
return "find2"; //这种写法需要在spirngmvc.xml中<!-- 配置视图信息 -->
}
}
4-2. spingmvc.xml配置
<!-- 配置注解扫描器 -->
<context:component-scan base-package="com.hx.spring.mvc" />
<!-- 放过静态资源 -->
<mvc:default-servlet-handler />
<!-- 启用mvc注解 , 扫描注解@RequestMapping、@ResponseBody...-->
<mvc:annotation-driven />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/back/" />
<property name="suffix" value=".html" />
<property name="order" value="0"></property>
</bean>
5. 返回ModelAndView的案例
5-1. 编写TestController.java
package com.hx.spring.mvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class TestController {
@RequestMapping("/test1")
public ModelAndView test1(){
ModelAndView mav = new ModelAndView("/back/index1.jsp"); //这里跳转页面需要删除上面xml配置的视图信息
mav.addObject("company","HUATHY科技");
return mav; //这里可能回发现jsp页面代码直接显示的问题
//则需注意本文第2点中的web.xml中的<url-pattern>/</url-pattern>,斜杠后不要带*号
}
@RequestMapping("/test2")
public ModelAndView test2(){
ModelAndView mav = new ModelAndView();
mav.setViewName("/back/index2.jsp"); //这里跳转页面需要删除上面xml配置的视图信息
mav.addObject("company","HUATHY科技");
mav.addObject("name","HUATHY");
return mav;
}
//若没有指定view,何?
//若spring-mvc.xml中配置了视图信息,那么会根据以下规则配置视图名称
//根据请求路径来
//若是 ../<项目名>/index1 -> 此时视图名是index1
//若是 ../<项目名>/index1.html -> 此时视图名是index1,会自动删除扩展名
//若是 ../<项目名>/index1 -> 此时视图名是/back/index1
@RequestMapping("/index1.html")
public ModelAndView index1(){
ModelAndView mav = new ModelAndView();
mav.addObject("company","HUATHY科技");
return mav;
}
@RequestMapping("index2")
public String index2(Model model){
model.addAttribute("company","HUATHY科技");
model.addAttribute("name","HUATHY");
return "/index2";
//这里我要访问的是index2.jsp,需要配置视图信息,见本文第5-2点
}
}
5-2. 修改spirng.mvc配置
<!--这里把“.html” 替换成 “.jsp”-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/back/" />
<property name="suffix" value=".html" />
</bean>
6.返回JSON格式的案例
这里必须在pom.xml中导入json包。
6-1 编写JsonController.java
package com.hx.spring.mvc.controller;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.hx.spring.mvc.entity.Person;
/*
* @ResponseBody注解告诉框架,将这个返回值当作正文返回。
* 那么这时若遇到对象,则必须使用对应的converter进行转换,一般是转成字符串进行返回
* 为什么要转成String? 这时需要从请求头中获取Accept信息。Accept可以使用逗号分割定义多个类型。
* 用来告诉服务器我只接受的类型响应
* AnnotationMethodHandlerAdapter中同样注入多个HttpMessageConverter,每个HttpMessageConverter都可以定义各自的supportedMediaTypes。
* HttpMessageConvert来完成对象到文本的序列化操作
*/
@RestController //相当于@Controller + @ResponseBody
public class JsonController {
@RequestMapping("/json1")
public Person find1(){
return new Person(101,"HUATHY",16,"1234567789");
}
@RequestMapping("/json2")
public List<Person> find2(){
List<Person> list = new ArrayList<Person>();
list.add( new Person(101,"HUATHY",16,"1234567789") );
list.add( new Person(102,"huasy",16,"1234567789") );
list.add( new Person(103,"XQ",16,"1234567789") );
return list;
}
@RequestMapping("/json3")
public Map<String,Object> find3(){
Map<String,Object> map = new HashMap<String, Object>();
map.put("company", "HUATHY");
map.put("name", "HUASY");
return map;
}
}
6-2编写Person.java
@Component
public class Person {
private int pid;
private String pname;
private int age;
private String tel;
public int getPid() {
return pid;
}
public void setPid(int pid) {
this.pid = pid;
}
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
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;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + pid;
result = prime * result + ((pname == null) ? 0 : pname.hashCode());
result = prime * result + ((tel == null) ? 0 : tel.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (age != other.age)
return false;
if (pid != other.pid)
return false;
if (pname == null) {
if (other.pname != null)
return false;
} else if (!pname.equals(other.pname))
return false;
if (tel == null) {
if (other.tel != null)
return false;
} else if (!tel.equals(other.tel))
return false;
return true;
}
public Person(int pid, String pname, int age, String tel) {
super();
this.pid = pid;
this.pname = pname;
this.age = age;
this.tel = tel;
}
public Person() {
super();
}
@Override
public String toString() {
return "Person [pid=" + pid + ", pname=" + pname + ", age=" + age + ", tel=" + tel + "]";
}
}
附:
- spirngmvc入门—springmvc的使用(1):https://blog.csdn.net/qq_40366738/article/details/104841413
- springmvc入门—springmvc的使用(2):https://blog.csdn.net/qq_40366738/article/details/104857441
- springmvc入门—springmvc的使用(3)interceptor拦截器:https://blog.csdn.net/qq_40366738/article/details/104905550
本文来自博客园,作者:Huathy,遵循 CC 4.0 BY-NC-SA 版权协议。转载请注明原文链接:https://www.cnblogs.com/huathy/p/17253901.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)