springmvc01
1.安装SpringMVC插件
包名称:springsource-tool-suite-3.4.0.RELEASE-e4.3.1-updatesite.zip(和springmvc版本必须一致)
作用:快速在web.xml中配置springmvc,alt+/ 选择dispatcherservlet
注意:配置完成后,修改 init-param和mapping
2.创建SpringMVC过程
I.创建Web工程
a. 增加Spring Jar包
b. Web.xml配置Spring支持
<?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"> <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> </servlet> <servlet-mapping> <servlet-name>SpringMvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
II.增加Spring配置
a.增加自动扫描的包
b.配置一个bean:视图解析器,逻辑视图转换为物理视图
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:p="http://www.springframework.org/schema/p" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd"> <!-- 自动扫描的包名 --> <context:component-scan base-package="com.test.controller" /> <!-- 默认的注解映射的支持 --> <mvc:annotation-driven> <mvc:message-converters> <bean class="org.springframework.http.converter.StringHttpMessageConverter" /> <bean class="org.springframework.http.converter.ResourceHttpMessageConverter" /> </mvc:message-converters> </mvc:annotation-driven> <!-- 视图解释类,定义跳转的文件的前后缀 --> <!-- <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <property name="prefix" value="/views/" /> <property name="suffix" value=".jsp"/> <property name="requestContextAttribute" value="rc" /> </bean> --> <!-- 拦截器 --> <!-- <mvc:interceptors> <bean class="com.fpx.ce.foundation.preference.PreferenceChangeInterceptor" /> <mvc:interceptor> <mvc:mapping path="/page/home"/> <bean class="com.fpx.ce.foundation.user.UserInterceptor" /> </mvc:interceptor> <mvc:interceptor> <mvc:mapping path="/service/**" /> <bean class="com.fpx.ce.foundation.log.LogHandlerInterceptor" /> </mvc:interceptor> <mvc:interceptor> <mvc:mapping path="/test/**" /> <mvc:mapping path="/service/**"/> <bean class="com.lemon.finder.web.SharedRenderVariableInterceptor" /> </mvc:interceptor> </mvc:interceptors> --> <!-- 对静态资源文件的访问 方案一 (二选一) --> <mvc:default-servlet-handler /> <mvc:annotation-driven/> <!-- 对静态资源文件的访问 方案二 (二选一) --> <!-- <mvc:resources mapping="/images/**" location="/images/" cache-period="31556926"/> <mvc:resources mapping="/js/**" location="/js/" cache-period="31556926"/> <mvc:resources mapping="/css/**" location="/css/" cache-period="31556926"/> --> </beans>
III.配置控制器
任何的javabean都可以作为控制器,@Controller
方法可以接受请求并且做出相应的响应。
@Controller public class 类 { @RequestMapping(value="/hello") public String 方法(){ return "success"; } }
方法的返回值:当前业务方法处理完毕之后,跳转的Web资源。
3.@RequestMapping注解
如果一个注解只有一个value属性,可以这样写RequestMapping("/hello")
I.修饰类
@RequestMapping(value="/springmvc") @Controller public class 类 { @RequestMapping(value="/hello") public String 方法(){ return "success"; } }
II.指定请求方法
@Request(value="/hello", method=RequestMethod.POST) //必须POST请求/hello
III.指定params和headers
param1 请求参数必须包含名为param1的请求参数
!param1 请求参数不能包含名为param1的请求参数
param1!=value1 可以包含param1的请求参数,但其值不能为value1
{"param1=value1","param2"} 多个请求参数指定
@Request(value="/hello", method=RequestMethod.POST,
params={"name=tom", "age!=12"},
headers={"accept=text/html"})
4.Ant风格的请求映射
?: 匹配文件名中的一个字符
* : 匹配文件命中的任意字符,指一层路径
**: **匹配多层路径
5.@PathVariable映射URL绑定的占位符
@RequestMapping(value="/hello/{id}")
public String helloword(@PathVariable(value="id") int id) {
System.out.println(id);
return "success";
}
6.REST风格
资源:网络上的实体
表现层:把资源具体呈现在客户端的方式
状态转换:Http是无状态请求,请求方式保存在服务端,是建立在表现层上
GET/POST/PUT/DELETE
//GET @RequestMapping(value="/testGet/{id}", method=RequestMethod.GET) public String testGet(@PathVariable(value="id") int id) { System.out.println("请求ID为:"+id+"数据"); return "success"; } //POST @RequestMapping(value="/testPost", method=RequestMethod.POST) public String testPost() { System.out.println("添加数据"); return "success"; }
//HiddentHttpMethodFilter:过虑器,可以过虑我们所有的请求,并且可以划分为四种。
//POST--> 寻找请求参数,是否有一个名字method这样的一个请求方式,值为DELETE、PUT请求来区分,如果没有则为POST
//支持PUT、DELETE请求必须在Web.xml增加过滤器
<filter> <filter-name>hiddenHttpMethodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddentHttpMethodFilter</filter-class> </filter> <filter-mapping> <filter-name>hiddenHttpMethodFilter</filter-name> <filter-pattern>/*</filter-pattern> </filter-mapping>
//DELETE
@RequestMapping(value="/testDelete/{id}", method=RequestMethod.DELETE)
public String testDelete(@PathVariable(value="id") int id) {
System.out.println("删除数据");
return "success";
}
//DELETE对应表单格式
<form action="springmvc/testDelete/12" method="POST"> <input type="hidden" name="_method" value="DELETE"/> <input type="submit" value="DELETE"/> </form>
//PUT
@RequestMapping(value="/testPut/{id}", method=RequestMethod.PUT)
public String testPost(@PathVariable(value="id") int id) {
System.out.println("修改数据");
return "success";
}
//PUT对应表单格式
<form action="springmvc/testPut/12" method="POST"> <input type="hidden" name="_method" value="PUT"/> <input type="submit" value="PUT"/> </form>
7.获取请求值@RequestParam注解
@RequestMapping(value="/testRequestParam") public String testRequestParam(@RequestParam(value="id", required=true) int id, @RequestParam(value="name") String name) { return "success"; }
a.如果形参和请求参数的名称一致时,可以省略RequestParam
b.如果不一致,则必须通过RequestParam的参数指定绑定的请求参数名称
c.required 如果请求参数不存在,则报出一个required的错误
8.POJO属性进行自动匹配,自动为该对象填充值,支持值联属性
public class Address{ private String city; private String country; //get/set构造方法 } public class User{ private Address address; private int id; private String name; //get/set/构造方法 @Override public String toString(){ return "User [id="+id+",name="+name+"]"; } @RequestMapping(value="/testRequestParam") public String testRequestParam(User user) String name) { user.toString(); return "success"; } }
User中的名称和jsp名称一致时,获取页面request请求值
<form action="/testRequestParam"> <input type="text" name="id" /> <input type="text" name="name" /> <input type="text" name="address.city" /> <input type="text" name="address.country" /> <input type="submit" value="submit"/> </form>
9.请求报文头 @RequestHeader注解
@RequestMapping(value="/testRequestHeader") public String testRequestHeader(@RequestHeader("Aceept") String a) { System.out.println(a); return "success"; }
10.请求Cookie,@CookieValue注解
@RequestMapping(value="/testRequestCookie") public String testCookie(@CookieValue("JSESSIONNID") String a) { System.out.println(a); return "success"; }
11.Servlet API作为参数
HttpServletRequest
HttpServletResponse
HttpSession
Java.security.Principal 授权
Locale 本地信息
InputStream
OutputStream
Reader
Writer 相应输出流对象
可以把这九种类型作为请求形参
@RequestMapping(value="/testServletAPI") public String testServletAPI(HttpServletRequest request, HttpServletResponse response) { System.out.println(request); System.out.println(response); return "success"; }
12. 处理模型数据
ModelAndView: 处理方法返回值类型为ModelAndView时,方法体既可以通过该对象添加模型数据
Map、Model:入参为org.springframework.ui.Model、org.springframework.ui.ModelMap或者java.util.Map时,处理方法返回时,Map中的数据会自动添加到模型中。
@SessionAttributes:将模型中的某个属性暂存到HttpSession中,以便更多请求之间可以共享属性
@ModelAttribute:方法入参标注该注解后,入参的对象就会放到数据模型中
I.ModelAndView
a)核心业务返回值为ModelAndView;模型数据,视图
b)方法的内部,创建ModelAndView对象
设置视图:
setView(View view);
setViewName(String);
添加数据:
addObject(String, Object);
addObjects(Map map);
c)ModelAndView当中的数据是放在请求范围中的
@RequestMapping("/testModelAndView")
public ModelAndView testModelAndView() {
ModelAndView mv = new ModelAndView();
//设置跳转的视图setView/setViewName
mv.setViewName("success");
//增加值,这些值是放在Request域中的
mv.addObject("name", "ival");
return mv;
}
II. Map/Model以及ModelMap
当中的数据是放在请求范围中的
@RequestMapping("/testMap")
public String testMap(Map<String, Object> map) {
map.put("age", 12);
return "success";
}
@RequestMapping("/testModel")
public String testModel(Model model) {
model.addAtrribute("mail", "ival@qq.com");
return "success";
}
@RequestMapping("/testModelMap")
public String testModelMap(ModelMap modelmap) {
modelmap.addAtrribute("mail", "ival@qq.com");
return "success";
}
13.@SessionAttribute多个请求之间共享数据
@Controller @RequestMapping("/SpringMVC") @SessionAtributes(value={"city"}) //提升city的域到Session域 public class HelloWorld { @RequestMapping(/testReqult) public String testResult() { return "result"; } }
@SessionAttribute 注意事项
1.要求放置的值,必须放在Model数据里(request范围中有限)
2.标注属性:
a) value:String[]
value={"a","b"}
b) types:Class[]
types={String.class}
14.@ModelAttribute 在数据之前对模型数据进行的处理
I.方法:在当前控制中所有的业务方法调用之前执行的方法
1)修改没有返回值的方法
@ModelAttribute public void start(Map<String, Object> map) { Account account = new Account(1,"TOM", "2016-1-1"); map.put("account", account) } @RequestMapping("/testModelAttribute") public String update(Account account){ System.out.println(account); return "success"; }
a.执行ModelAttribute修改方法
b.获取的原始数据放置到请求范围中指定的key,对应的value
c.pojo入参从请求范围当中查找指定key对应的value对象,找到的话,对象的
d.前端用户数据的值与业务方法的入参进行绑定。
2)修改有返回值的方法
@ModelAttribute public Account start(value="abc") { Account account = new Account(1,"TOM", "2016-1-1"); retrun account; } @RequestMapping("/testModelAttribute") public String update(@ModelAttribute("abc")Account account){ System.out.println(account); return "success"; }
II. 业务方法的入参
方法的入参,告知方法入参进行前段绑定之前,首先请求范围当中查找指定的key(POJO类的首字母小写对应的单词)对应的value值对象。
@ModelAttribute public void start(Map<String, Object> map) { Account account = new Account(1,"TOM", "2016-1-1"); map.put("abc", account) } @RequestMapping("/testModelAttribute") public String update(@ModelAttribute("abc") Account account){ System.out.println(account); return "success"; }
15. 视图解析流程
I.视图最终的页面选软,View视图来做,render。
II.跳转到目标视图。
16.国际化
写对应的资源文件.properties
资源文件的名称_语言编码_国家编码.properties
abc_zh_CH.properties
abc_en.US.properties
内容:key=value
I.国际化的资源
II.告知springMVC所使用的资源文件
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <property name="basename" value="abc"></property> </bean>
注意:id必须为messageSource
III.JSTL页面使用标签使用国际化
Core: <fmt:message key="id"><fmt:message>
16.页面给视图定义一个映射mvc:view-controller
<mvc:view-controller path="/abcdef" view-name="a"> //a逻辑视图对应原来的a.jsp
如果给某一个视图设置映射信息,其他控制方法映射全部无效,必须加上下面的配置
<mvc:annotatime-driven></mvc:annotatime-driven>
17.自定义视图
I.视图类型:实现一个接口view
@Component //注解生成bean对应的id为类的首字母写的名称即myView public class MyView implements View { public String getContextType(){ return "text/html"; } @Override public void render(Map<String, ?>model, HttpServletRequest request, HttpServletResponse response)throws Exception{ } }
II.视图加载Spring容器中
III.对应视图解析器:BeanNameResolver
//自定义视图的解析器,优先级(内部资源解析器优先级最高)
<bean class="org.springframework.web.servlet.view.BeanNameResolver" > <property name="basename" value="100"></property> </bean>
18.spring的form表单
I.传统JSP完成从服务端获取的数据,显示的时候,非常复杂。
II.form表单标签库,来代替所有的表单标签。
1.可以完成回显
2.可以代替JSP当中一些复杂操作
III.使用流程
1.引入form表单
2.常用标签
1)<form:form>:可以完成回显的操作,modelAttribute:完成回显。key,自动的到请求范围中,寻找指定key对应的value值,如果没有指定
modelAttribute属性,springmvc自动的请求范围当中去寻找一个叫做commmad这样key对应的对象,如果也没有command。出错。
2)<form:input path="">:文本框,path的name属性值
3)
<%@ taglib="" prefix="form" %> <form:form action="" method="" modelAttribute="abc"> <table> <tr><td>name</td><td><form:input path="name"/></td></tr> <tr><td>emill</td><td><from:input path="mail"/></td></tr> <tr><td>gender</td>td><form:radiobuttons path="gender" items="${requestScop.genders}"></td></tr> <tr><td>department</td><td>form:select path="depts.deptName" items="${requestScope.depts}" itemLabel="deptName" itemvlue="deptid"<td></tr> <tr><input type="submit" vaue="add"/></tr> <tbale> </form:form>
map.put("abc", empl);
19.Springmvc如何处理静态资源
I.springmvc的配置文件
<mvc:default-servlet-handler/> //让DisppatcherServlet核心控制器,其他的映射全部失效
II. <mvc:annotation-driven/>

浙公网安备 33010602011771号