SpringMVC1 环境搭建测试与常见报错处理

环境搭建

Tomcat

Tomcat下载官网
在这里插入图片描述

在这里插入图片描述

Tomcat端口被占用无法启动

在这里插入图片描述

netstat -aon|findstr “80”
在这里插入图片描述
在这里插入图片描述
添加链接描述
管理员身份运行:

在这里插入图片描述
在这里插入图片描述

测试

index.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<a href="dispatcher?control=demo">TIAO_ZHUAN</a>
<a href="dispatcher?control=demo1">TIAO_ZHUAN</a>
<a href="http://www.baidu.com">TIAO_ZHUAN</a>
</body>
</html>
package com.read.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class DispatcherServlet
 */
//@WebServlet("/DispatcherServlet")
@WebServlet("/")/*不过滤jsp,其他全部过滤*/
public class DispatcherServlet extends HttpServlet {
    
    
	private static final long serialVersionUID = 1L;
	
	
	@Override
	public void service(ServletRequest request, ServletResponse response)
			throws ServletException, IOException {
    
    
		// TODO Auto-generated method stub
		System.out.println("Servlet中的service方法用于应答浏览器请求,每次请求都会调用该方法。");
        }
 
	
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public DispatcherServlet() {
    
    
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
		// TODO Auto-generated method stub
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

在这里插入图片描述
Servlet中的service方法

在这里插入图片描述

@Override
	public void service(ServletRequest request, ServletResponse response)
			throws ServletException, IOException {
    
    
		// TODO Auto-generated method stub
		String result=request.getParameter("control");	
		System.out.println("Servlet中的service方法用于应答浏览器请求,每次请求都会调用该方法。"+result);
        }

在这里插入图片描述


SpringMVC配置测试

前端控制模式
DispatcherServlet:前端控制器
HandlerMapping:解析请求格式
HandlerAdapter:调用方法
ViewResovler:视图解析

SpringMVC导入jar包:添加链接描述添加链接描述,解压后导入到lib

在这里插入图片描述
在这里插入图片描述
复制全限定类名
在这里插入图片描述

.xml中注册servlet

  <servlet>
  <servlet-name>springmvc</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <load-on-startup>1</load-on-startup><!-- Tomcat启动,该类被加载 -->
  </servlet>
  <servlet-mapping>
  <servlet-name>springmvc</servlet-name>
  <url-pattern>/</url-pattern>
  </servlet-mapping>

springmvc的配置文件:
默认路径是WEB-INF下 springmvc-servlet.xml(注册的servlet-name-servlet.xml)
也可配置路径:

  <servlet>
  <servlet-name>springmvc</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <init-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath:springmvc.xml</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup><!-- Tomcat启动,该类被加载 -->
  </servlet>
  <servlet-mapping>
  <servlet-name>springmvc</servlet-name>
  <url-pattern>/</url-pattern>
  </servlet-mapping>

springmvc.xml

f4查看要配置的接口的实现类:
在这里插入图片描述
在以下文件中配置

<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.1.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-4.1.xsd 
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd">
    </beans>
 <!-- 以下是 控制器的配置,解析请求 (控制器必须配置,其他的可以自动生成)-->
    <bean name="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping" >
  		<property name="urlMap">
   			<props>
   				<prop key="demo">demoController</prop>
   				<!-- <prop key="控制器的逻辑名">Controller</prop>
   				 http://localhost:8080/demo(项目名)/**(控制器的逻辑名)-->
   			</props>
  		</property>
  	</bean>  	
	<bean name="demoController"  class="/demo/src/controller/DemoController.java">
	</bean>
package controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

public class DemoController implements Controller{
    
    

	@Override
	public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
    
    
		// TODO Auto-generated method stub
		System.out.println("springmvc控制器");
		return null;
	}



}

注解方法配置

导入jar包

在这里插入图片描述

报错信息

Caused by: java.lang.IllegalArgumentException: 找到多个名为spring_web的片段

解决方法
在lib包中有两个不同版本的Spring,检查你的依赖关系
删除其中一个spring版本依赖

web.xml

  <servlet>
  <servlet-name>springmvc</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <init-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath:springmvc.xml</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup><!-- Tomcat启动,该类被加载 -->
  </servlet>
  <servlet-mapping>
  <servlet-name>springmvc</servlet-name>
  <url-pattern>/</url-pattern>
  </servlet-mapping>

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.1.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-4.1.xsd 
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd">
    <!-- 扫描注解 -->
    <context:component-scan base-package="demo"></context:component-scan>
    <!-- 注解驱动 --><!--此标签相当于DefaultAnnotationHandlerMapping类和AnnotationMethodHandlerAdapter-->
    <!-- 配置视图解析器 如何把handler 方法返回值解析为实际的物理视图  根据控制器返回的字符串拼接成jsp路径:/WEB-INF/page/xx.jsp -->
    <mvc:annotation-driven></mvc:annotation-driven>
    </beans>

在这里插入图片描述


传递基本类型和对象

基本类型(默认保证参数名称和请求中传递的参数名称一致)

 <form action="demo" method="post">
 <input type="text" name="name"/>
 <input type="submit" value="tijiao"/>
 </form>
package demo;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class DemoController {
    
    
	@RequestMapping("demo")
     public String demo(String name ) {
    
    
    	 System.out.println("执行demo"+name);
    	 return "/mian.jsp";
     }
	@RequestMapping("demo2")
    public String demo2() {
    
     
   	 System.out.println("执行demo");
   	 return "mian1.jsp";
    }
}

当前后端参数名称不一致时:
@RequestParam(value=“前端的名称”,defaultValue=“默认值”,required=true)//required=true必须传递对应的参数

@RequestMapping("demo")
     public String demo(@RequestParam(value="前端的名称") String name ) {
    
    
    	 System.out.println("执行demo"+name);
    	 return "/mian.jsp";
     }

在这里插入图片描述

对象

package demo;

public class User {
    
    
private String name;
private int age;
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;
}
@Override
public String toString() {
    
    
	return "User [name=" + name + ", age=" + age + "]";
}	
	
}

Spring将帮你自动注入对象成员变量:
在这里插入图片描述

HttpServletReauest:

@RequestMapping("demo")
     public String demo(User user,HttpServletRequest req ) {
    
    
    	 System.out.println("执行demo"+user);
    	 req.setAttribute("attribute","attribute");
    	 return "/mian.jsp";
     }

在这里插入图片描述


跳转方式

1.默认的跳转方式是转发

@RequestMapping("demo2")
    public String demo2() { 	
   	 System.out.println("执行demo2");
   	 return "mian1.jsp";//转发
    }

2.设置返回字符串内容
2.1 添加 redirect: 资源路径 重定向
2.2 添加 forward:资源路径 转发

@RequestMapping("demo2")
    public String demo2() { 	
   	 System.out.println("执行demo2");
   	 return "redirect:mian1.jsp";//重定向
    }

自定义视图解析器:
1.SpringMVC会提供默认的视图解析器


@ResponseBody

在只有@RequestMapping(""),方法有返回值时必定跳转
在方法中添加@ResponseBody(不跳转)
2.1 如果返回值满足key-value形式(对象或map)
2.1.1 把响应头设置为application/json;charset=utf-8
2.1.2 把转换后的内容输出流的形式响应给客户端
2.2不满足,如String
2.2.1把响应头设置为text/html
2.2.2把方法返回值以流的形式直接输出
2.2.3返回值如果有中文会出现乱码,用@RequestMapping(value=“demo5”,produces=“text/html;charset=utf-8”)处理
例子:

public void demo3(HttpServletRequest req,HttpServletResponse res)throws Exception {
    
     	
	   	 System.out.println("执行demo3");
	   	 PrintWriter out= res.getWriter();
	   	 out.print("abc");
	   	 out.flush();
	   	 out.close();
	    }

在这里插入图片描述

@RequestMapping("demo4")
	@ResponseBody//将返回值转换成json字符串不跳转用流的方式输出,同时设置响应头的类型为application/json
	 public User demo4()throws Exception {
    
     	
	   	 System.out.println("执行demo4");
	   	 User user=new User();
	   	 user.setName("小王");
	   	 user.setAge(18);
	   	 return user;
	    }

需要导入jar
在这里插入图片描述
http://localhost/demo/demo4
在这里插入图片描述
在这里插入图片描述
@RequestMapping中produces用于配置请求头中Content Type的取值

@RequestMapping(value="demo5",produces="text/html;charset=utf-8")
	@ResponseBody
	 public String demo5()throws Exception {
    
     	
	   	 System.out.println("执行demo5");
	   	 User user=new User();
	   	 user.setName("小王");
	   	 user.setAge(18);
	   	 return "中文";//只要返回值都认为是跳转
	    }

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/ResumeProject/article/details/113527888