springmvc入门—springmvc的使用(2)

springmvc中的注解

  • @Controller :说明这是一个控制器,这个注解是通过<context:component-scan />来扫描的。
  • @PathVariable(“uid”)Integer id:从请求路径中取值。写在变量类型倩。将uid的值注入的id中。
  • @RequestMapping :可以出现在类或方法上,若出现在类上,则请求的url为 类上注解的 + 方法上@RequestMapping注解的地址。
  1. @RequestMapping除了可以使用url映射请求外,还可以使用请求方法、请求参数及请求头映射请求。
  2. 值:value(请求路径)、method(请求方法)、params(请求参数)、heads(请求头)。
  3. params:
    – param1:表示请求必须包含名为param1的参数。
    – !param1:表示请求中不可包含名为param1的参数。
    – param1!=hello:表示请求包含名为param1的参数,但值不可以是hello。
    – {“param1=hello”,“param2”} :表示请求中必须包含值为hello的参数param1,与任意值的param2。
  4. 若类上的不写,则url就是方法上@RequestMapping注解的url地址
  5. 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 + "]";
	}
}

附:

  1. spirngmvc入门—springmvc的使用(1):https://blog.csdn.net/qq_40366738/article/details/104841413
  2. springmvc入门—springmvc的使用(2):https://blog.csdn.net/qq_40366738/article/details/104857441
  3. springmvc入门—springmvc的使用(3)interceptor拦截器:https://blog.csdn.net/qq_40366738/article/details/104905550
发布了46 篇原创文章 · 获赞 57 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_40366738/article/details/104857441