Spring MVC 中的 @RestController VS @Controller 与 AngularJs
@RestController VS @Controller in Spring MVC with AngularJs
我想用 Spring MVC Rest Web 服务和 angularJs 创建一个应用程序。
所以我的问题是当我放入我的控制器@Controller 一切正常时(我有我的页面home1.jsp)但是当我使用@RestController 时我的浏览器显示一个字符串("home1")。
你能帮忙理解我的问题吗,谢谢。
这是我的代码:
*应用程序控制器
@RestController
@RequestMapping("/service")
public class AppController {
@Autowired
MyService myService;
private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
/**
* Simply selects the home view to render by returning its name.
*/
@RequestMapping(value = "/home1", method = RequestMethod.GET)
public String home(Locale locale, Model model) {
logger.info("Welcome home! The client locale is {}.", locale);
Date date = new Date();
DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
String formattedDate = dateFormat.format(date);
model.addAttribute("serverTime", formattedDate );
return "home1";
}
// GET ALL
@RequestMapping(value="/allProfiles",method = RequestMethod.GET,headers="Accept=application/json")
public List<Profil> getProfils()
{
System.out.println("RestControllern methode initialized");
return myService.getAllProfiles();
}
@RequestMapping(value="/allPatterns",method = RequestMethod.GET,headers="Accept=application/json")
public @ResponseBody List<Pattern> getPatterns()
{
logger.info("Welcome home! allPatterns {}.");
System.out.println("RestControllern methode initialized");
Pattern p = new Pattern();
p.setId(5);
p.setValue("moiuuyyt");
return myService.getAllPattern();
}
@RequestMapping(value="/allComponents",method = RequestMethod.GET,headers="Accept=application/json")
public List<Component> getComponents()
{
return myService.getAllComponent();
}
//GET ONE
@RequestMapping(value="/components/{id}",method = RequestMethod.GET,headers="Accept=application/json")
public Component getComponent(@PathVariable int id)
{
return myService.getComponentById(id);
}
@RequestMapping(value="/profiles/{id}",method = RequestMethod.GET,headers="Accept=application/json")
public Profil getProfil(@PathVariable int id)
{
return myService.getProfilById(id);
}
@RequestMapping(value="/patterns/{id}",method = RequestMethod.GET,headers="Accept=application/json")
public Pattern getPattern(@PathVariable int id)
{
return myService.getPatternById(id);
}
//SAVE
@RequestMapping(value="/addpattern/{value}",method= RequestMethod.POST, headers="Accept=application/json")
public String addPattern(@PathVariable String value)
{
Pattern pat = new Pattern();
pat.setValue(value);
myService.addPattern(pat);
return "redirect:/service/allPatterns";
}
@RequestMapping(value="/addprofil",method = RequestMethod.POST,headers="Accept=application/json")
public void addProfil()
{
Profil pr = new Profil();
pr.setProfilName("Profil1");
myService.addProfil(pr);
}
@RequestMapping(value="/addcomponent",method = RequestMethod.POST,headers="Accept=application/json")
public void addComponent(Component cp)
{
myService.addComponent(cp);
}
public MyService getMyService() {
return myService;
}
public void setMyService(MyService myService) {
this.myService = myService;
}
/**
* @return The page of all Patterns after we have updated one of them to test the method
*/
@RequestMapping(value="/updatepattern/{i}/{value}",method= RequestMethod.PUT, headers="Accept=application/json")
public String updatePattern(@PathVariable int i,@PathVariable String value)
{
/*List<Pattern> liste = myService.getAllPattern();
Pattern p = liste.get(0);
p.setValue("^/[0-9]Pattern has been updated");
myService.updatePattern(p);*/
Pattern p = myService.getPatternById(i);
p.setValue(value);
myService.updatePattern(p);
return "redirect:/service/home1";
}
/**
* @return The page of all Patterns after we have deleted one of them to test the method
*/
@RequestMapping(value="/deletepattern/{id}",method= RequestMethod.DELETE, headers="Accept=application/json")
public String DeletePattern(@PathVariable int id)
{
/*List<Pattern> liste = myService.getAllPattern();
Pattern p = liste.get(3);*/
Pattern p = myService.getPatternById(id);
myService.deletePattern(p);
return "redirect:/service/home1";
}
}
***Home1.jsp
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<!Doctype html>
<html data-ng-app="myTest" lang="en">
<head>
<title>Home</title>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular-route.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular-resource.min.js"></script>
<script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body >
<h1>
Hello world!
</h1>
<P> The time on the server is ${serverTime}. </P>
<hr/>
<div data-ng-controller="myController" style="margin-left: 100px">
<div>
<p>ALL PATTERNS</p>
<button class="btn btn-default" data-ng-click = "listPattern()">All Patterns</button>
<br/><br/>
<table class="table" data-ng-hide="state" style="width: 600px">
<tr>
<th>Id_Pattern</th>
<th>Pattern</th>
</tr>
<tr data-ng-repeat="p in patterns">
<td>{{p.id}}</td>
<td>{{p.value}}</td>
</tr>
</table>
</div>
<br/><br/><hr/>
<div>
<h3>ADD PATTERN</h3>
<form class="form-inline">
<div class="form-group">
<input type ="text" class="form-control" placeholder="Pattern value" data-ng-model="value"/>
<button class="btn btn-default" data-ng-click = "addPattern()">New Pattern</button>
</div>
</form>
</div>
<br/><br/><hr/>
<div>
<h3>UPDATE PATTERN</h3>
<form class="form-inline">
<div class="form-group">
<input type ="text" class="form-control" placeholder="PATTERN_ID" data-ng-model="selectedPattern"/>
<input type ="text" class="form-control" placeholder="new Pattern value" data-ng-model="newvalue"/>
<button class="btn btn-default" data-ng-click = "updatePattern()">Update</button>
</div>
</form>
</div>
<br/><br/><hr/>
<div>
<h3>DELETE PATTERN</h3>
<form class="form-inline">
<div class="form-group">
<input type ="text" class="form-control" placeholder="PATTERN ID" data-ng-model="id_pattern"/>
<button class="btn btn-default" data-ng-click = "deletePattern()">Delete</button>
</div>
</form>
</div>
</div>
<script>
var module = angular.module('myTest',[]);
module.controller('myController',function($scope,$http){
//function to get Patterns Lists
$scope.state = true;
$scope.listPattern = function() {
$http({method: 'GET', url: 'allPatterns'}).
success(function(data) {
$scope.patterns = data;
$scope.state = !$scope.state;
});
};
/*Function to add pattern
@param the pattern value
@return pattern lists
*/
$scope.addPattern = function(){
if($scope.value == "" )
{
alert("You must Enter all specified fields");
}
else
{
$http({method:'POST', url:'addpattern/'+$scope.value}).
success(function (data){
$scope.patterns = data;
$scope.state = false;
});
}
};
/*Function to update pattern
@param the pattern value
@return pattern lists
*/
$scope.updatePattern = function(){
if($scope.newvalue == "" || $scope.selectedPattern == "")
{
alert("You must Enter all specified fields");
}
else
{
$http({method:'PUT', url:'updatepattern/'+$scope.selectedPattern+'/'+$scope.newvalue}).
success(function (data){
$scope.patterns = data;
$scope.state = false;
});
}
$scope.newvalue="";
$scope.selectedPattern="";
};
/*Function to update pattern
@param the pattern value
@return pattern lists
*/
$scope.deletePattern = function(){
if($scope.id_pattern == "" )
{
alert("You must Enter all specified fields");
}
else
{
$http({method:'DELETE', url:'deletepattern/'+$scope.id_pattern}).
success(function (data){
$scope.patterns = data;
$scope.state = false;
});
}
$scope.id_pattern="";
};
$scope.value="";
$scope.state = true;
});
</script>
</body>
</html>
web.xml
上下文配置位置
/WEB-INF/spring/root-context.xml
<!-- Creates the Spring Container shared by all Servlets and Filters -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- Processes application requests -->
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>/home1.jsp</welcome-file>
</welcome-file-list>
***调度员****
<?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:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xmlns:beans="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/data/jpa
http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">
<!-- Enable annotation-based Spring MVC controllers (eg: @Controller annotation) -->
<mvc:annotation-driven/>
<context:annotation-config/>
<!-- Classpath scanning of @Component, @Service, etc annotated class -->
<context:component-scan base-package="com.demo.projet1.controllers" />
<context:component-scan base-package="com.demo.projet1.services" />
<context:component-scan base-package="com.demo.projet1.repositories" />
<jpa:repositories base-package="com.demo.projet1.repositories"/>
<!-- Resolve view name into jsp file located on /WEB-INF -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
使用@RestController
注解时,所有@RequestMapping方法默认采用@ResponseBody语义。这就是 home1
作为字符串返回的原因。如果您混合使用 JSP
视图和 Responsebody
,那么我建议使用 @Controller
注释。
我想用 Spring MVC Rest Web 服务和 angularJs 创建一个应用程序。 所以我的问题是当我放入我的控制器@Controller 一切正常时(我有我的页面home1.jsp)但是当我使用@RestController 时我的浏览器显示一个字符串("home1")。 你能帮忙理解我的问题吗,谢谢。 这是我的代码: *应用程序控制器
@RestController
@RequestMapping("/service")
public class AppController {
@Autowired
MyService myService;
private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
/**
* Simply selects the home view to render by returning its name.
*/
@RequestMapping(value = "/home1", method = RequestMethod.GET)
public String home(Locale locale, Model model) {
logger.info("Welcome home! The client locale is {}.", locale);
Date date = new Date();
DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
String formattedDate = dateFormat.format(date);
model.addAttribute("serverTime", formattedDate );
return "home1";
}
// GET ALL
@RequestMapping(value="/allProfiles",method = RequestMethod.GET,headers="Accept=application/json")
public List<Profil> getProfils()
{
System.out.println("RestControllern methode initialized");
return myService.getAllProfiles();
}
@RequestMapping(value="/allPatterns",method = RequestMethod.GET,headers="Accept=application/json")
public @ResponseBody List<Pattern> getPatterns()
{
logger.info("Welcome home! allPatterns {}.");
System.out.println("RestControllern methode initialized");
Pattern p = new Pattern();
p.setId(5);
p.setValue("moiuuyyt");
return myService.getAllPattern();
}
@RequestMapping(value="/allComponents",method = RequestMethod.GET,headers="Accept=application/json")
public List<Component> getComponents()
{
return myService.getAllComponent();
}
//GET ONE
@RequestMapping(value="/components/{id}",method = RequestMethod.GET,headers="Accept=application/json")
public Component getComponent(@PathVariable int id)
{
return myService.getComponentById(id);
}
@RequestMapping(value="/profiles/{id}",method = RequestMethod.GET,headers="Accept=application/json")
public Profil getProfil(@PathVariable int id)
{
return myService.getProfilById(id);
}
@RequestMapping(value="/patterns/{id}",method = RequestMethod.GET,headers="Accept=application/json")
public Pattern getPattern(@PathVariable int id)
{
return myService.getPatternById(id);
}
//SAVE
@RequestMapping(value="/addpattern/{value}",method= RequestMethod.POST, headers="Accept=application/json")
public String addPattern(@PathVariable String value)
{
Pattern pat = new Pattern();
pat.setValue(value);
myService.addPattern(pat);
return "redirect:/service/allPatterns";
}
@RequestMapping(value="/addprofil",method = RequestMethod.POST,headers="Accept=application/json")
public void addProfil()
{
Profil pr = new Profil();
pr.setProfilName("Profil1");
myService.addProfil(pr);
}
@RequestMapping(value="/addcomponent",method = RequestMethod.POST,headers="Accept=application/json")
public void addComponent(Component cp)
{
myService.addComponent(cp);
}
public MyService getMyService() {
return myService;
}
public void setMyService(MyService myService) {
this.myService = myService;
}
/**
* @return The page of all Patterns after we have updated one of them to test the method
*/
@RequestMapping(value="/updatepattern/{i}/{value}",method= RequestMethod.PUT, headers="Accept=application/json")
public String updatePattern(@PathVariable int i,@PathVariable String value)
{
/*List<Pattern> liste = myService.getAllPattern();
Pattern p = liste.get(0);
p.setValue("^/[0-9]Pattern has been updated");
myService.updatePattern(p);*/
Pattern p = myService.getPatternById(i);
p.setValue(value);
myService.updatePattern(p);
return "redirect:/service/home1";
}
/**
* @return The page of all Patterns after we have deleted one of them to test the method
*/
@RequestMapping(value="/deletepattern/{id}",method= RequestMethod.DELETE, headers="Accept=application/json")
public String DeletePattern(@PathVariable int id)
{
/*List<Pattern> liste = myService.getAllPattern();
Pattern p = liste.get(3);*/
Pattern p = myService.getPatternById(id);
myService.deletePattern(p);
return "redirect:/service/home1";
}
}
***Home1.jsp
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<!Doctype html>
<html data-ng-app="myTest" lang="en">
<head>
<title>Home</title>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular-route.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular-resource.min.js"></script>
<script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body >
<h1>
Hello world!
</h1>
<P> The time on the server is ${serverTime}. </P>
<hr/>
<div data-ng-controller="myController" style="margin-left: 100px">
<div>
<p>ALL PATTERNS</p>
<button class="btn btn-default" data-ng-click = "listPattern()">All Patterns</button>
<br/><br/>
<table class="table" data-ng-hide="state" style="width: 600px">
<tr>
<th>Id_Pattern</th>
<th>Pattern</th>
</tr>
<tr data-ng-repeat="p in patterns">
<td>{{p.id}}</td>
<td>{{p.value}}</td>
</tr>
</table>
</div>
<br/><br/><hr/>
<div>
<h3>ADD PATTERN</h3>
<form class="form-inline">
<div class="form-group">
<input type ="text" class="form-control" placeholder="Pattern value" data-ng-model="value"/>
<button class="btn btn-default" data-ng-click = "addPattern()">New Pattern</button>
</div>
</form>
</div>
<br/><br/><hr/>
<div>
<h3>UPDATE PATTERN</h3>
<form class="form-inline">
<div class="form-group">
<input type ="text" class="form-control" placeholder="PATTERN_ID" data-ng-model="selectedPattern"/>
<input type ="text" class="form-control" placeholder="new Pattern value" data-ng-model="newvalue"/>
<button class="btn btn-default" data-ng-click = "updatePattern()">Update</button>
</div>
</form>
</div>
<br/><br/><hr/>
<div>
<h3>DELETE PATTERN</h3>
<form class="form-inline">
<div class="form-group">
<input type ="text" class="form-control" placeholder="PATTERN ID" data-ng-model="id_pattern"/>
<button class="btn btn-default" data-ng-click = "deletePattern()">Delete</button>
</div>
</form>
</div>
</div>
<script>
var module = angular.module('myTest',[]);
module.controller('myController',function($scope,$http){
//function to get Patterns Lists
$scope.state = true;
$scope.listPattern = function() {
$http({method: 'GET', url: 'allPatterns'}).
success(function(data) {
$scope.patterns = data;
$scope.state = !$scope.state;
});
};
/*Function to add pattern
@param the pattern value
@return pattern lists
*/
$scope.addPattern = function(){
if($scope.value == "" )
{
alert("You must Enter all specified fields");
}
else
{
$http({method:'POST', url:'addpattern/'+$scope.value}).
success(function (data){
$scope.patterns = data;
$scope.state = false;
});
}
};
/*Function to update pattern
@param the pattern value
@return pattern lists
*/
$scope.updatePattern = function(){
if($scope.newvalue == "" || $scope.selectedPattern == "")
{
alert("You must Enter all specified fields");
}
else
{
$http({method:'PUT', url:'updatepattern/'+$scope.selectedPattern+'/'+$scope.newvalue}).
success(function (data){
$scope.patterns = data;
$scope.state = false;
});
}
$scope.newvalue="";
$scope.selectedPattern="";
};
/*Function to update pattern
@param the pattern value
@return pattern lists
*/
$scope.deletePattern = function(){
if($scope.id_pattern == "" )
{
alert("You must Enter all specified fields");
}
else
{
$http({method:'DELETE', url:'deletepattern/'+$scope.id_pattern}).
success(function (data){
$scope.patterns = data;
$scope.state = false;
});
}
$scope.id_pattern="";
};
$scope.value="";
$scope.state = true;
});
</script>
</body>
</html>
web.xml 上下文配置位置 /WEB-INF/spring/root-context.xml
<!-- Creates the Spring Container shared by all Servlets and Filters -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- Processes application requests -->
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>/home1.jsp</welcome-file>
</welcome-file-list>
***调度员****
<?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:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xmlns:beans="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/data/jpa
http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">
<!-- Enable annotation-based Spring MVC controllers (eg: @Controller annotation) -->
<mvc:annotation-driven/>
<context:annotation-config/>
<!-- Classpath scanning of @Component, @Service, etc annotated class -->
<context:component-scan base-package="com.demo.projet1.controllers" />
<context:component-scan base-package="com.demo.projet1.services" />
<context:component-scan base-package="com.demo.projet1.repositories" />
<jpa:repositories base-package="com.demo.projet1.repositories"/>
<!-- Resolve view name into jsp file located on /WEB-INF -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
使用@RestController
注解时,所有@RequestMapping方法默认采用@ResponseBody语义。这就是 home1
作为字符串返回的原因。如果您混合使用 JSP
视图和 Responsebody
,那么我建议使用 @Controller
注释。