您的位置:首页 > 其它

srpingmvc-restful风格学习总结

2015-10-23 12:34 190 查看
这次项目要用springMvc的rest风格进行开;然后就看了些视频,仅仅看视频感觉效果不大,反而增加了它的神秘性。后来开始亲自去实践,感觉没那么难啊,demo做完之后;真的感觉soeasy!下面就和大家分享一下,从此RestFul开发不在神秘。

Demo

一,配置文件

1.Springmvc.xml文件:

<span style="font-family:Microsoft YaHei;">必要的配置(常规配置):
<!--配置自动扫描的包 -->
<context:component-scanbase-package="com.atguigu.springmvc"></context:component-scan>

<!--配置视图解析器 -->
<beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver">
<propertyname="prefix" value="/WEB-INF/views/"></property>
<propertyname="suffix" value=".jsp"></property>
</bean>

<!--
default-servlet-handler将在 SpringMVC 上下文中定义一个 DefaultServletHttpRequestHandler,
它会对进入DispatcherServlet 的请求进行筛查, 如果发现是没有经过映射的请求, 就将该请求交由 WEB 应用服务器默认的
Servlet处理. 如果不是静态资源的请求,才由 DispatcherServlet 继续处理

一般WEB 应用服务器默认的 Servlet 的名称都是 default.
若所使用的WEB 服务器的默认 Servlet 名称不是 default,则需要通过 default-servlet-name 属性显式指定

-->
<mvc:default-servlet-handler/>
<!--注解 -->
<mvc:annotation-driven/>
<!--配置自动扫描的包 -->
<context:component-scanbase-package="com.atguigu.springmvc"></context:component-scan>

<!--配置视图解析器 -->
<beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver">
<propertyname="prefix" value="/WEB-INF/views/"></property>
<propertyname="suffix" value=".jsp"></property>
</bean>

<!--
default-servlet-handler将在 SpringMVC 上下文中定义一个 DefaultServletHttpRequestHandler,
它会对进入DispatcherServlet 的请求进行筛查, 如果发现是没有经过映射的请求, 就将该请求交由 WEB 应用服务器默认的
Servlet处理. 如果不是静态资源的请求,才由 DispatcherServlet 继续处理

一般WEB 应用服务器默认的 Servlet 的名称都是 default.
若所使用的WEB 服务器的默认 Servlet 名称不是 default,则需要通过 default-servlet-name 属性显式指定

-->
<mvc:default-servlet-handler/>
<!--注解 -->
<mvc:annotation-driven/>

需要注意一点:
<mvc:default-servlet-handler/>,该配置时处理那些静态资源的(去映射文件中去找,找不到就到默认的文件中去找)。

总结:Springmvc.xml主要配置如下几点
1.配置扫描的包(处理我们的请求)
2.配置注解
3.配置视图的解析
4.其他配置(包括静态资源配置)</span>


                2.Web.xml文件

<span style="font-family:Microsoft YaHei;"><!--配置 SpringMVC 的 DispatcherServlet;Springweb服务器的前端控制器,负责处理所有应用请求 -->
<servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<!--程序一启动就会初始化springmvc.xml的配置;这里springmvc.xml在classpath(src)路径下 -->
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!--Map all requests to the DispatcherServlet for handling,这也会把静态资映射过去(在springmvc.xml中,配置了默认处理器去处理) -->
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

<!--浏览器不知put,delete请求,但是我们可以通过将post请求转化成put,delete请求 -->
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping></span>


二、页面:

 1.雇员的列表页:

              


 
代码如下:

<span style="font-family:Microsoft YaHei;"><!DOCTYPEhtml PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<metahttp-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Inserttitle here</title>
<!--
SpringMVC处理静态资源:
1.为什么会有这样的问题:
优雅的REST 风格的资源URL 不希望带 .html 或 .do 等后缀
若将DispatcherServlet 请求映射配置为 /,
则Spring MVC 将捕获 WEB 容器的所有请求, 包括静态资源的请求, SpringMVC 会将他们当成一个普通请求处理,
因找不到对应处理器将导致错误。
2.解决: 在 SpringMVC 的配置文件中配置 <mvc:default-servlet-handler/>
-->
<scripttype="text/javascript"src="scripts/jquery-1.9.1.min.js"></script>
<scripttype="text/javascript">
//它也给我们提供了一种如何将普通的提交转化成表单提交的提交方式
$(function(){
$(".delete").click(function(){
varhref = $(this).attr("href");
$("form").attr("action",href).submit();
returnfalse;
});
})
</script>
</head>
<body>

<formaction="" method="POST">
<inputtype="hidden" name="_method" value="DELETE"/>
</form>

<c:iftest="${empty requestScope.employees }">
没有任何员工信息.
</c:if>
<c:iftest="${!empty requestScope.employees }">
<tableborder="1" cellpadding="10" cellspacing="0">
<tr>
<th>ID</th>
<th>LastName</th>
<th>Email</th>
<th>Gender</th>
<th>Department</th>
<th>Edit</th>
<th>Delete</th>
</tr>

<c:forEachitems="${requestScope.employees }" var="emp">
<tr>
<td>${emp.id}</td>
<td>${emp.lastName}</td>
<td>${emp.email}</td>
<td>${emp.gender== 0 ? 'Female' : 'Male' }</td>
<td>${emp.department.departmentName}</td>
<td><ahref="emp/${emp.id}">Edit</a></td>
<td><aclass="delete"href="emp/${emp.id}">Delete</a></td>
</tr>
</c:forEach>
</table>
</c:if>

<br><br>

<ahref="emp">Add New Employee</a>

</body>
</html>
</span>


注意:
restful风格的删除是Delete请求,但是浏览器不支持Delete,PUT请求;但是呢我们通过在web.xml中
配置了HiddenHttpMethodFilter,它可以将我们Post请求转化成Delete,PUT。
进行请求的转化需要做如下工作:
<formaction="" method="POST">
<input type="hidden"name="_method" value="DELETE"/>
</form>。
2.这里的put和delete的操作都是通过表单提交,这两种方式还可以通过ajax的方式进行提交;具体还请大家亲自去实践。
 
切记:input一定要name="_method",因为请求转换的时候需要用到该参数。
 

2.编辑雇员

 


<span style="font-family:Microsoft YaHei;"><%@page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="form"uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="c"uri="http://java.sun.com/jsp/jstl/core" %>

<!DOCTYPEhtml PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<metahttp-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Inserttitle here</title>

</head>
<body>
<!-- 添加和编辑页面都要通过modelAttribute,最好设置当前对象 -->
<!-- 模型属性默认command,这里是employee(需要加载的是偶把对象赋值上即使是null),表单的数据必须与绑定模型属性一致,很重要一个属性,在controler中必须给employee,实例化; -->
<form:formaction="${pageContext.request.contextPath}/emp"method="Post" modelAttribute="employee">
<c:iftest="${employee.id==null }">
LastName:<form:inputpath="lastName"/><br>
</c:if>
<c:iftest="${employee.id!=null }">
<divstyle="display:none">
LastName:<form:inputpath="lastName"/><br>
</div>
<form:hiddenpath="id"/>
<input  type="hidden"name="_method" value="PUT" />
</c:if>

Email:<form:inputpath="email" delimiter="<br>"/><br>
Gender:
<br><form:radiobuttonspath="gender" items="${genders}"/><br>
Department:<form:select path="department.id"
items="${departments}" itemLabel="departmentName"itemValue="id"></form:select><br>
<inputtype="submit" value="提交"/>
</form:form>
</body>
</html></span>


注意:这里涉及到put提交,它同上述的Delete使用是一样的。
 

 三、controler代码:

<span style="font-family:Microsoft YaHei;">packagecom.atguigu.springmvc.handlers;

importjava.util.HashMap;
importjava.util.Map;

importjavax.validation.Valid;

importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.stereotype.Controller;
importorg.springframework.validation.Errors;
importorg.springframework.validation.FieldError;
importorg.springframework.web.bind.annotation.ModelAttribute;
importorg.springframework.web.bind.annotation.PathVariable;
importorg.springframework.web.bind.annotation.RequestMapping;
importorg.springframework.web.bind.annotation.RequestMethod;
importorg.springframework.web.bind.annotation.RequestParam;

importcom.atguigu.springmvc.crud.dao.DepartmentDao;
importcom.atguigu.springmvc.crud.dao.EmployeeDao;
importcom.atguigu.springmvc.crud.entities.Employee;

@Controller
publicclass EmployeeHandler {
//@Autowired,根据类型自动装配
@Autowired
privateEmployeeDao employeeDao;

@Autowired
privateDepartmentDao departmentDao;

//这里是当提交的员工lastName为空时,会报错,这时我们可以采用这种方式。当然在这里我通过掩藏值的方式控制前台页面显示,所以真正提交的时候我的值都在,就不会存在这个问题。
//        @ModelAttribute
//        publicvoid getEmployee(@RequestParam(value="id",required=false) Integer id,
//                        Map<String,Object> map){
//                if(id!= null){
//                        map.put("employee",employeeDao.get(id));
//                }
//        }

//1)编辑员工信息,然后更新
@RequestMapping(value="/emp",method=RequestMethod.PUT)
publicString update(Employee employee){
employeeDao.save(employee);

return"redirect:/emps";
}

@RequestMapping(value="/emp/{id}",method=RequestMethod.DELETE)
publicString delete(@PathVariable("id") Integer id){
employeeDao.delete(id);
return"redirect:/emps";
}

//2)添加员工
@RequestMapping(value="/emp",method=RequestMethod.POST)
publicString save( Employeeemployee){
employeeDao.save(employee);
return"redirect:/emps";
}
//3)编辑员工页面
@RequestMapping(value="/emp/{id}",method=RequestMethod.GET)
publicString input(@PathVariable("id") Integer id, Map<String,Object> map){
map.put("employee",employeeDao.get(id));
//性别
Map<String,String>mapGender=new HashMap<String,String>();
mapGender.put("1","Male");
mapGender.put("0","Female");
map.put("genders",mapGender);
map.put("departments",departmentDao.getDepartments());
return"input";
}

//4)添加员工页面
@RequestMapping(value="/emp",method=RequestMethod.GET)
publicString input(Map<String, Object> map){
map.put("departments",departmentDao.getDepartments());
//性别
Map<String,String>mapGender=new HashMap<String,String>();
mapGender.put("1","Male");
mapGender.put("0","Female");
map.put("genders",mapGender);
//就算没有值也好设置,否则找不到bean会报错。
map.put("employee",new Employee());
return"input";
}

//5)查询员工列表
@RequestMapping("/emps")
publicString list(Map<String, Object> map){
map.put("employees",employeeDao.getAll());
return"list";
}
}</span>


总结以下几点:
1.这里涉及到四种请求处理方式:get(查询),post(添加),put(修改),delete(删除)。
2.我们的请求响应决定因素
1)前台,我们路径及传参,提交方式(get等)
2)controler去配置
通过@RequestMapping(value="/emp/{id}",method=RequestMethod.GET)中value值和method类型就能确定我们所要执行的方法;只要value和method的值不与其他RequestMapping相同,即使方法名相同,它也代表不同的响应方法。
如:controler中2)添加员工和3)编辑员工页面;
3.跳转有两种
1)直接跳转页面,
return"list";
2)通过重定向。
return"redirect:/emps";
 
4常用注解标签
http://justice-jl.iteye.com/blog/1814980
 

       总结:

我们不要把srpingmvc的restful风格看的很神秘,它不是标准,只是提供了一组设计原则和约束条件,它可以使我们的程序更加简洁,更加油层次感等。
这件事让我懂得,学习使一个反复实践(只理论没实践假把式)的过程。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: