环境搭建
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);
}
}
@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 "中文";//只要返回值都认为是跳转
}