先来看一下常见的一些注解:
@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";
}
}
控制台测试结果如下:
多运行几次日志文件结果如下:
来源:CSDN
作者:poetteaes
链接:https://blog.csdn.net/poetteaes/article/details/81676654