SpringMVC注解

爱⌒轻易说出口 提交于 2019-12-09 01:12:00

先来看一下常见的一些注解:

@Controller   标记一个是Controller。

@RequestMapping 表明哪些URL可以被Controller处理,匹配Controller,可以指定只处理GET或者POST。

@ResponseBody 表明Controller返回结果不会别解析成跳转路径(不需要视图处理器去查找相应的视图),而是将返回解析后写入到Response对象的body数据区,可以用来返回JSON或者XML数据。  

@RequestParam Controller方法参数中使用 @RequestParam ,可以获取请求参数

@PathVariable  Controller方法参数中使用,获取URL中的参数

接下来进行一些测试,以便进一步探索SpringMVC,这里会对传递参数、HttpServletRequest和HttpServletResponse使用、返回XML和JSON报文到Response对象的body数据区进行测试:

建立一个Dynamic Web Project,工程识图如下:

 

先给出代码如下:

(1)web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>WebServiceDmo</display-name>
  <welcome-file-list>
    <welcome-file>/WEB-INF/jsp/index.jsp</welcome-file>
  </welcome-file-list>
  
  
  
  <servlet>
    <servlet-name>WebServiceDmo</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
 
  <servlet-mapping>
    <servlet-name>WebServiceDmo</servlet-name>
    <url-pattern>/</url-pattern>
   </servlet-mapping>
  
  
</web-app>

(2) WebServiceDmo-servlet.xml

<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:context="http://www.springframework.org/schema/context"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:mvc="http://www.springframework.org/schema/mvc" 
   xsi:schemaLocation="
   http://www.springframework.org/schema/beans     
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
   http://www.springframework.org/schema/context 
   http://www.springframework.org/schema/context/spring-context-3.0.xsd
   http://www.springframework.org/schema/mvc 
   http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd ">
   
   
   
   <context:component-scan base-package="com.test.controller" />
   
   <mvc:annotation-driven /> 
 
   <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
      <property name="prefix" value="/WEB-INF/jsp/" />
      <property name="suffix" value=".jsp" />
   </bean>
 
</beans>

(3)index.jsp

<%@ page contentType="text/html; charset=UTF-8" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 
<html>
 
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>SpringMVC test</title>
</head>
 
<body>
   <p>${str}</p>
</body>
 
</html>

(4)result.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
     <p>hello</p>
</body>
</html>

(5) ServiceServlet.java

package com.test.controller;

import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;

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

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.ui.ModelMap;

import com.test.entity.*;

import net.sf.json.JSONObject;

/*
@Controller
@RequestMapping("/test")   //http://localhost:8080/WebServiceDmo/test
public class ServiceServlet {
	   @RequestMapping(method = RequestMethod.GET)
	   public String findTestView(ModelMap model) {
	      model.addAttribute("str", "Test");
	      return "result";
	   }
 
}
*/

/*
@Controller
@RequestMapping("/test")  //http://localhost:8080/WebServiceDmo/test?key=Test
public class ServiceServlet {
       @RequestMapping(method = RequestMethod.GET)
	   public String findTestView( @RequestParam("key") String key, ModelMap model) {
	      model.addAttribute("str", key);
	      return "result";
	   }
 
}
*/


/*
@Controller
@RequestMapping("/test/{key}")   //http://localhost:8080/WebServiceDmo/test/Test
public class ServiceServlet {
       @RequestMapping(method = RequestMethod.GET)
	   public String findTestView(@PathVariable("key") String key, ModelMap model) {
	      model.addAttribute("str", key);
	      return "result";
	   }
}
*/


/*
@Controller
@RequestMapping("/test")    //http://localhost:8080/WebServiceDmo/test?key=Test
public class ServiceServlet {
       @RequestMapping(method = RequestMethod.GET)
	   public String findTestView(HttpServletRequest req, ModelMap model) {
    	  String key = req.getParameter("key");
	      model.addAttribute("str", key);
	      return "result";
	   }
}
*/

/*
@Controller
@RequestMapping("/test")    //http://localhost:8080/WebServiceDmo/test
public class ServiceServlet {
       @RequestMapping(method = RequestMethod.GET)
       public ModelAndView findTestView() {
    	   ModelAndView model = new ModelAndView();
    	   model.setViewName("result");
           model.addObject("str", "Test");
           return model;
       }
}
*/


/*
@Controller
@RequestMapping(value="/test")    //http://localhost:8080/WebServiceDmo/test?str=Test
@ResponseBody
public class ServiceServlet {
	@RequestMapping(method = RequestMethod.GET)
	public void writeResponse(HttpServletRequest req, HttpServletResponse resp){
		String str = req.getParameter("str");
		
		resp.setContentType("text/html;charset=UTF-8");
		PrintWriter pw = null;
		try {
			pw = resp.getWriter();
			
			pw.println("<html>");
			pw.println("<body>");
			pw.println("<p>"+str+"</p>");
			pw.println("</body>");
			pw.println("</html>");
			
			pw.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
}
*/

/*
@Controller
@RequestMapping("/test")    //http://localhost:8080/WebServiceDmo/test
@ResponseBody
public class ServiceServlet {
	  
       @RequestMapping(method = RequestMethod.GET)
       public  void findTestView(HttpServletResponse resp) {
    	   
    	   //Student student  = new Student("1001", "kevin");
    	   
    	   HashMap<String, String> map = new HashMap<String, String>();
    	   map.put("id", "1001");
    	   map.put("name", "张三");
    	   
    	   try {
    		resp.setContentType("text/json;charset=UTF-8");
			resp.getWriter().write(JSONObject.fromObject(map).toString());
			//resp.getWriter().write(JSONObject.fromObject(map).toString());
		} catch (IOException e) {
			e.printStackTrace();
		}

       }
}
*/


/*返回XML*/
@Controller
@RequestMapping("/test")    //http://localhost:8080/WebServiceDmo/test    http://localhost:8080/WebServiceDmo/test.xml
@ResponseBody
public class ServiceServlet {
	  
       @RequestMapping(method = RequestMethod.GET)
       public  Student findTestView(HttpServletResponse resp) {
    	   
    	   Student student  = new Student("1001", "张三");
    	   
           return student;
       }
}






(6)Student.java

package com.test.entity;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Student {
	private String id; 
	private String name;
	
	public Student() {
		
	}
	
    public Student(String name, String id) {
    	this.name = name;
    	this.id = id;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	public String getName() {
		return this.name;
	}

	
	public void setId(String id) {
		this.id = id;
	}
	
	public String getId() {
		return this.id;
	}
}

ServletService.java给出了若干个例子,其中后三个是数据写到response对象的body区(使用@ResponseBody注解),其他几个都是需要查找解析视图(这里要查找解析的是result.jsp)。第二个和第三个样例的方法参数中使用了@PathVariable和@RequestParam,用户获取请求中的参数,第五个样样例还展示了从从HttpServletResponse对象获取参数的方法。

倒数第二个个例子返回JSON报文,需要如下jar包:

tocmcat中运行结果如下:

 最后一个例子返回XML报文,Student实体类使用了@XmlRootElement注解,结果如下:

这里对log4j2日志配置也予以说明,需要引入如下jar包:

log4j2的配置文件弃用了log4j的.properties配置方式,而是采用JSON或者XML方式,简单的XML配置文件如下,输出到屏幕:

log4j2.xml放在src目录下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml>
<Configuration status="WARN">  

    <Appenders>  
        <Console name="Console" target="SYSTEM_OUT">  
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />  
        </Console>  
    </Appenders>  

    <Loggers>  
        <Root level="DEBUG">  
            <AppenderRef ref="Console" />  
        </Root>  
    </Loggers>  
    
</Configuration>

修改ServiceServlet.java用于测试,如下:

import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;


@Controller
@RequestMapping("/test")   //http://localhost:8080/WebServiceDmo/test
public class ServiceServlet {
	private static Logger logger = LogManager.getLogger(ServiceServlet.class.getName());
	
	   @RequestMapping(method = RequestMethod.GET)
	   public String findTestView(ModelMap model) {
	      model.addAttribute("str", "Test");
	      
	      System.out.println("test");
	      
	      logger.debug("debug test");
	      logger.info("info test");
	      logger.warn("warn test");
	      logger.error("error test");
	      logger.fatal("fatal test");
	      
	      return "result";
	   }
 
}

控制台输出如下:

再来往文件中输出日志,log4j2.xml配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml>

<!--log4j2框架本身的日志级别-->
<Configuration status="ERROR"> 
    <properties>
        <property name="LOG_PATH">D:/logs</property>
        <property name="LOG_FILE_NAME">WebServiceDmolog</property>
    </properties>

    <!--Appenders是日志输出的配置 可以是Console File RollingRandomAccessFile等-->
    <Appenders>  
        <Console name="Console" target="SYSTEM_OUT">  
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />  
        </Console>

        <!--RollingRandomAccessFile达到一定大小可以重新备份然后使用一个新文件 filePattern设置备份日志的路径和文件名-->
        <RollingRandomAccessFile name="RollingRandomAccessFileLog" fileName="${LOG_PATH}/${LOG_FILE_NAME}.log" filePattern="${LOG_PATH}/$${date:yyyyMMdd}/${LOG_FILE_NAME}.log.%d{yyyyMMdd}%i">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
            <Policies>
                <!--文件达到多大后备份,也可以按照时间来生成备份-->
                <SizeBasedTriggeringPolicy size="1 KB"/>
            </Policies>
            <DefaultRolloverStrategy max="100"/>  <!--最多可以有多少个备份文件-->
        </RollingRandomAccessFile>

    </Appenders>  

    <!--日志器-->
    <Loggers>  
        <Logger name="DebugLogFileLoger" level="DEBUG" additivity="true">  
            <AppenderRef ref="RollingRandomAccessFileLog" />  
        </Logger>
        
        <!--默认-->
        <Root level="DEBUG">  
            <AppenderRef ref="Console" />  
        </Root> 
        
        
    </Loggers>  
</Configuration>

修改ServiceServlet.java用于测试,如下:

import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;


@Controller
@RequestMapping("/test")   //http://localhost:8080/WebServiceDmo/test
public class ServiceServlet {
	private static Logger logger = LogManager.getLogger("DebugLogFileLoger");
	
	   @RequestMapping(method = RequestMethod.GET)
	   public String findTestView(ModelMap model) {
	      model.addAttribute("str", "Test");
	      
	      System.out.println("test");
	      
	      logger.debug("debug test");
	      logger.info("info test");
	      logger.warn("warn test");
	      logger.error("error test");
	      logger.fatal("fatal test");
	      
	      return "result";
	   }
 
}

控制台测试结果如下:

多运行几次日志文件结果如下:

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!