- 浏览: 127890 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
calosteward:
赞一个。 谢谢分享了~非常有用。 —————————————— ...
项目里用到的Jquery,json,struts2结合 -
zhouylf:
文章都还行,就是变量名起的好恶心,“wzXxfbPdtp”还 ...
Springmvc3实现文件上传 -
zongshoujin:
老大 List和Map 在前台解析不出来,我看了下 是j ...
struts2返回JSON,jquery解析JSON(返回的可能是LIST,MAP,对象,单个值) -
kfjihailong:
269565478@qq.com 求源码
springmvc+dwz+xheditor实现上传图片及swf 视频 -
eric.zhang:
jieAmei 写道能给我发一下这个代码吗?谢谢,452909 ...
dwz+jquery+fileupload+springmvc实现文件上传 及图片预览
web.xml
springmvc-servlet.xml
能封装表单参数的 AbstractCommandController,CommondController、 FormController
web-inf/add_dept.jsp
springmvc-servlet.xml
会正常转换 整型及字符串,如果输入的不是一个整数,就会为0;
spring mvc 默认提供了一些属性编辑器:int,float,double,long,string,class,url
DeptController
自定义属性编辑器:
MultiActionController
简化URL映射关系
HanderMapping:
ControllerClassNameHanderMapping:按类名映射
annotation注解方式实现
controller类:
web.xml:
springmvc-servlet.xml
访问:http://localhost:8080/springmvc/start.do
会直接跳转到/pages/start.jsp
@RequestMapping:可以修饰类,及类里面的方法
如果在类级别定义了@RequestMapping,相当于定义了一个相对路径
如下:
@Controller
@RequestMapping("/test")
public class TestController {
@RequestMapping("/start")
public String start(){
return "start";
}
}
如果需要访问start方法,则应该是 localhost:8080/springmvc/test/start.do
如果没有类级别的@RequestMapping,则访问方法start方法,则应该是localhost:8080/springmvc/start.do, /:相当于根路径,处理求的方法必须要有@RequestMapping注解
处理以后请求,资源文件与上面相同,只是controller上不一样
http://localhost:8080/springmvc/start.do?name=zhangsan
spring3.0引入了一种restful风格的模式:基于url参数的形式进行请求,如下:
http://localhost:8080/springmvc/start.do?name=zhangsan
http://localhost:8080/springmvc/start.do?name=lisi
处理形式:restful风格,请求的参数作为url一部分存在
http://localhost:8080/springmvc/start/zhangsan.do
http://localhost:8080/springmvc/start/lisi.do
支持restful风格需要有一个参数PathVariable,定义url模板,指定可变部分:
例子:处理
http://localhost:8080/springmvc/start/zhangsan.do
http://localhost:8080/springmvc/start/lisi.do
配置文件以之前一样,Controller类里:
----------------------------------------------------
如果是多个可变参数:
如URL请求为:
http://localhost:8080/springmvc/start/zhangsan/20.do
===========================================================
@RequestMapping:可以根据不同的请求方法,映射到不同的处理方法,与之前的formcontroller相似,请求方法:post,get
http://localhost:8080/springmvc/test/1986-07-06.do
自动封装属性
http://localhost:8080/springmvc/testMethod.do?name=xxx&pass=xxx
User类里有name,pass属性:
Controller类里的方法:
基于配置文件的SpringMVC处理请求的方法定义总结:
public (ModelAndView | Map | String | void) actionName(HttpServletRequest request, HttpServletResponse response, [,HttpSession] [,AnyObject]);
参数类型:
1.HttpServletRequest(必须有)
2. HttpServletRespons(必须有)
3。HttpSession(可选)
4.AnyObject(可选)
备注:如果object与session都有,则session应为第三个参数
返回值类型:
1,ModelAndView
2.Map
3.String
4.void
基于注解的MVC,能够处理请求的方法定义总结:
参数类型:对数量及顺序是没有要求的
1,可以没有();
2,可以是HttpServletRequest
3,可以是HttpServletResponse
4,可以是HttpSession
5,可以是路径变量@PathVariable
6,可以是@RequestParam
7,可以是@CookieValue
8,可以是@RequestHeader
9,可以是PrintWriter
10,可以是Map model
11,可以是领域模型对象
备注:HttpSessiond需要有一个前提条件,那就是当前请求的session可用:即在这之前session已经被初始化:也就是说在这之前调用了request.getSession()或者session.setAttribute(),直接进入jsp页面,也会初始化session
返回值类型:
1,ModelAndView
2.Map
3.String:代表了viewName,model也会自动返回
4.void:一般使用out方法输出之后就用void
5.AnyType:返回任意类型的对象
6.List
Spring MVC 常用 ViewResolver & View
@、 InternalResourceViewResolver、 UrlBasedViewResolver
@、Redirect 重定向视图 (redirect:)
@、XmlViewResovler
@、视图链
@、JstlView, ExcelView及自定义view (JsperReport, Pdf, Excel)
重定向视图:
防止重复提交,可以使用重定向
@RequestMapping(method=RequestMethod.POST)
public String addUser(User user){
return "redirect:/add_success";
}
#######拦截器,视图国际化,验证############################
拦截器:inteceptor
全局日志,权限管理
1.定义拦截器:
springmvc-servlet.xml
国际化ResourceMessage
在根路径下建立资源文件:
mess.properties
mess_en_US.properties
mess_zh_CN.properties
分别定义如下:
welcome="welcome"
welcome="(US)welcome"
welcome="欢迎你!"
jsp页面里,使用<spring:message/>
加载国际化资源文件,需要在springmvc-servlet.xml里配置
如下:
JSR-303 validate bean 验证
如:User类里
然后在Controller里
在参数里加@Valid注解,就会当这个user进行绑定的时候,就验证,验证的规则定义在User类里,如果验证过程出错,就会把错误信息放在BindingResult里
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <!-- Spring ApplicationContext配置文件的路径 此参数用于后面的Spring-Context loader --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:spring/*.xml</param-value> </context-param> <!--Spring ApplicationContext 载入 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> </web-app>
springmvc-servlet.xml
<?xml version="1.0" encoding="UTF-8"?> <!-- 修改说明: 1.修改<context:component-scan以确定要加载的controller,默认为com.**.controller 2.修改class=ControllerClassNameHandlerMapping节点的pathPrefix以确定要生成的前缀 --> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd" > <!-- <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/> <context:component-scan base-package="com.**.controller"/> <bean class="cn.org.rapid_framework.spring.web.servlet.mvc.support.ControllerClassNameHandlerMapping" > </bean> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <property name="prefix" value="/pages"/> <property name="suffix" value=".jsp"></property> </bean> --> <!-- it's ok;--> <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="test.do">testController</prop> <prop key="testExtends.do">testExtendsController</prop> <prop key="login.do">loginController</prop> <prop key="login2.do">login2Controller</prop> </props> </property> </bean> <!-- 直接直向页面/WEB-INF/login.jsp --> <bean id="loginController" class="org.springframework.web.servlet.mvc.ParameterizableViewController"> <property name="viewName" value="login"></property> </bean> <!-- login2Controller会指向 prop key='login2.do'里的login2页面+前后缀 --> <bean id="login2Controller" class="org.springframework.web.servlet.mvc.UrlFilenameViewController"> </bean> <bean id="testController" class="com.company.project.controller.TestController"></bean> <bean id="testExtendsController" class="com.company.project.controller.TestExtendsController"></bean> <bean class="org.springframework.web.servlet.view.UrlBasedViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property> <property name="prefix" value="/WEB-INF/"></property> <property name="suffix" value=".jsp"></property> </bean> </beans>
能封装表单参数的 AbstractCommandController,CommondController、 FormController
web-inf/add_dept.jsp
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <body> <form action="" method="post"> name:<input type="text" name="name"><br> createDate:<input type="text" name="createDate"><br> <input type="submit" value="add"> </form> </body> </html>
springmvc-servlet.xml
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="add_dept.do">addDeptController</prop> </props> </property> </bean> <bean id="addDeptController" class="com.company.project.controller.DeptController"> <property name="commandClass" value="com.company.project.model.Department"></property> </bean> <bean class="org.springframework.web.servlet.view.UrlBasedViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property> <property name="prefix" value="/WEB-INF/"></property> <property name="suffix" value=".jsp"></property> </bean>
会正常转换 整型及字符串,如果输入的不是一个整数,就会为0;
spring mvc 默认提供了一些属性编辑器:int,float,double,long,string,class,url
DeptController
package com.company.project.controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.validation.BindException; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.AbstractCommandController; import com.company.project.model.Department; public class DeptController extends AbstractCommandController{ //数据绑定 到model里。 @Override protected ModelAndView handle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, BindException arg3) throws Exception { Department dept = (Department)arg2; return null; } }
自定义属性编辑器:
package com.company.project.controller; import java.text.SimpleDateFormat; import java.util.Date; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.beans.propertyeditors.CustomDateEditor; import org.springframework.validation.BindException; import org.springframework.web.bind.ServletRequestDataBinder; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.AbstractCommandController; import com.company.project.MyConverter; import com.company.project.model.Department; public class DeptController extends AbstractCommandController{ //数据绑定 到model里。 @Override protected ModelAndView handle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, BindException arg3) throws Exception { Department dept = (Department)arg2; return null; } @Override protected void initBinder(HttpServletRequest arg0, ServletRequestDataBinder binder) throws Exception { //这是一种做法 //binder.registerCustomEditor(Date.class, new MyConverter()); // 日期类型提供了半成品的一个属性编辑器 true:表示可以不输入这个日期,也就是说这个日期可以为空 binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"),true)); } }
MultiActionController
package com.company.project.controller; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.multiaction.MultiActionController; import com.company.project.model.Department; public class MultController extends MultiActionController{ //方法必须要有request,response,可选参数session,Model public ModelAndView toAdd(HttpServletRequest request,HttpServletResponse response){ //ModelAndView mav = new ModelAndView("add_dept",model); ModelAndView mav = new ModelAndView(); Map<String, Object> depts = new HashMap<String, Object>(); //设置视图名称 mav.setViewName("add_dept"); //设置模型 mav.addAllObjects(depts); return mav; } public ModelAndView toList(HttpServletRequest request,HttpServletResponse response,HttpSession session,Department dept){ System.out.println(dept); //return "success"; return new ModelAndView("success"); } public Map xxx(HttpServletRequest request,HttpServletResponse response){ } }
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="add_dept.do">addDeptController</prop> <prop key="list_dept.do">addDeptController</prop> </props> </property> </bean> <!-- 只有MultiActionController --> <bean id="addDeptController" class="com.company.project.controller.MultController"> <property name="commandClass" value="addDept.do"></property> <!-- 方法名解析器 --> <property name="methodNameResolver"> <!-- 按路径名解析,如prop key=list_dept.do,会执行list_dept方法,所以请求需跟方法名一致 <bean class="org.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver"></bean> --> <!-- 按参数解析 --> <bean class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver"> <!-- 参数名需要有fun,然后根据fun的值,执行该方法,如:?fun=to_add,会执行to_add方法 --> <property name="paramName" value="fun"></property> </bean> </property> </bean> <bean class="org.springframework.web.servlet.view.UrlBasedViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"> </property> <property name="prefix" value="/WEB-INF/"></property> <property name="suffix" value=".jsp"></property> </bean>
简化URL映射关系
HanderMapping:
ControllerClassNameHanderMapping:按类名映射
<!-- 如果访问的URL为dept.do,会去找名称为DeptController类,id,name不重要 如果是MultController,如果是按路径名(InternalPathMethodNameResolver)解析器,可以用 mult/to_add.do:会执行MultController里的to_add方法 --> <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"> </bean> <bean id="xxx" class="test.DeptController"></bean> <!-- 只有MultiActionController --> <bean id="addDeptController" class="com.company.project.controller.MultController"> <property name="commandClass" value="addDept.do"></property> <!-- 方法名解析器 --> <property name="methodNameResolver"> <!-- 按路径名解析,如prop key=list_dept.do,会执行list_dept方法,所以请求需跟方法名一致 --> <bean class="org.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver"></bean> <!-- 按参数解析 <bean class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver"> 参数名需要有fun,然后根据fun的值,执行该方法,如:?fun=to_add,会执行to_add方法 <property name="paramName" value="fun"></property> </bean> --> </property> </bean> <bean class="org.springframework.web.servlet.view.UrlBasedViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"> </property> <property name="prefix" value="/WEB-INF/"></property> <property name="suffix" value=".jsp"></property> </bean>
<!--BeanNameUrlHandlerMapping:会根据bean的url进行拦截 这种对MultController没办法使用--> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"> </bean> <bean name="/test.do" class="com.company.project.controller.TestController"></bean>
annotation注解方式实现
controller类:
package test.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class TestController { @RequestMapping("/start") public String start(){ return "start"; } }
web.xml:
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- Spring ApplicationContext配置文件的路径,可使用通配符,多个路径用1,号分隔 此参数用于后面的Spring-Context loader --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:spring/*.xml</param-value> <!-- 手动指定配置文件位置及名称 <param-value>/WEB-INF/classes/springmvc-servlet.xml</param-value> <param-value>/WEB-INF/classes/*.xml</param-value> 在spring包下的所有xml文件 <param-value>/WEB-INF/classes/spring/*.xml</param-value> <param-value>classpath*:spring/*.xml</param-value> --> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> </web-app>
springmvc-servlet.xml
<?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:p="http://www.springframework.org/schema/p" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/mvc http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"> <!-- 基于注解的方式 --> <context:component-scan base-package="test.controller"/> <!-- InternalResourceViewResolver:是在基于url的基础之上,加入了JSP,JSTL的视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <property name="prefix" value="/pages"/> <property name="suffix" value=".jsp"></property> </bean> </beans>
访问:http://localhost:8080/springmvc/start.do
会直接跳转到/pages/start.jsp
@RequestMapping:可以修饰类,及类里面的方法
如果在类级别定义了@RequestMapping,相当于定义了一个相对路径
如下:
@Controller
@RequestMapping("/test")
public class TestController {
@RequestMapping("/start")
public String start(){
return "start";
}
}
如果需要访问start方法,则应该是 localhost:8080/springmvc/test/start.do
如果没有类级别的@RequestMapping,则访问方法start方法,则应该是localhost:8080/springmvc/start.do, /:相当于根路径,处理求的方法必须要有@RequestMapping注解
处理以后请求,资源文件与上面相同,只是controller上不一样
http://localhost:8080/springmvc/start.do?name=zhangsan
package test.controller; import javax.servlet.http.HttpServletRequest; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class TestController { @RequestMapping("/start") //可以只加一个request,也可以根据需要添加response,session,model等参数 public String start(HttpServletRequest request){ //传统的处理方法, String name= request.getParameter("name"); return "start"; } }
spring3.0引入了一种restful风格的模式:基于url参数的形式进行请求,如下:
http://localhost:8080/springmvc/start.do?name=zhangsan
http://localhost:8080/springmvc/start.do?name=lisi
处理形式:restful风格,请求的参数作为url一部分存在
http://localhost:8080/springmvc/start/zhangsan.do
http://localhost:8080/springmvc/start/lisi.do
支持restful风格需要有一个参数PathVariable,定义url模板,指定可变部分:
例子:处理
http://localhost:8080/springmvc/start/zhangsan.do
http://localhost:8080/springmvc/start/lisi.do
配置文件以之前一样,Controller类里:
----------------------------------------------------
package test.controller; import javax.servlet.http.HttpServletRequest; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class TestController { //{name}:表示可变部分,/start/{name}就是URL模板 @RequestMapping("/start/{name}") //可以只加一个request,也可以根据需要添加response,session,model等参数 public String start(@PathVariable("name") String name){ //@PathVariable String name:路径变量;用于取URL模板里可变部分的值,2个name须一致 System.out.println(name); return "start"; } }
如果是多个可变参数:
@Controller public class TestController { @RequestMapping("/start/{name}/{age}") public String start(@PathVariable("name") String name,@PathVariable("age") int nianling){ System.out.println(name); System.out.println(nianling); return "start"; } }
如URL请求为:
http://localhost:8080/springmvc/start/zhangsan/20.do
===========================================================
@RequestMapping:可以根据不同的请求方法,映射到不同的处理方法,与之前的formcontroller相似,请求方法:post,get
package test.controller; import javax.servlet.http.HttpServletRequest; 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; @Controller public class TestController { //处理get请求,如直接在地址栏输入 http://localhost:8080/springmvc/start.do @RequestMapping(value="/start",method=RequestMethod.GET) public String start(){ return "start_get"; } //处理post请求, form以post方式提交,http://localhost:8080/springmvc/start.do @RequestMapping(value="/start",method=RequestMethod.POST) public String startPost(){ //跳转到start_post.jsp页面 return "start_post"; } }
http://localhost:8080/springmvc/test/1986-07-06.do
package test.controller; import java.text.SimpleDateFormat; import java.util.Date; import javax.servlet.http.HttpServletRequest; import org.springframework.beans.factory.config.CustomEditorConfigurer; import org.springframework.beans.propertyeditors.CustomDateEditor; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.InitBinder; 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.support.WebRequestDataBinder; @Controller @RequestMapping("/test") public class TestController { //如果方法上没指定映射的value,则会映射到类级别/test @RequestMapping(value="{test}",method=RequestMethod.GET) public String startPost(@PathVariable("test") Date test){ System.out.println(test); return "success"; } @InitBinder //参数可以有request,response,session,webrequestdatabinder(绑定数据) public String initBinder(WebRequestDataBinder binder){ //所有日期类型都会进行转换,且不能不空 binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"),false)); } }
@Controller @RequestMapping("/test") public class TestController { //如果方法上没指定映射的value,则会映射到类级别/test @RequestMapping(value="{test}",method=RequestMethod.GET) public String startPost(@PathVariable("test") Date test){ System.out.println(test); return "success"; } @InitBinder //参数可以有request,response,session,webrequestdatabinder(绑定数据) public String initBinder(WebRequestDataBinder binder){ //所有日期类型都会进行转换,且不能不空 binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"),false)); } @RequestMapping("/testRequest") public void testRequest(@RequestParam int id,@CookieValue anytype cookieName,@RequestHeader("content-type") anyType abc ){ //@RequestParam int id 类型可以是任何类型,参数名必须与请求的参数名一样 //@RequestHeader:从请求头里取,@RequestHeader("user-Agent"):浏览器类型 //@CookieValue:从cookie里取 //http://localhost:8080/springmvc/testRequest.do?id=xxx System.out.println(id); } }
@RequestMapping("/testOut") public String testOut(PrintWriter out,Map model){ //这里的out相当于 response.getWriter(); out.println("hello "); //这里的model相当于ModelAndView对象,会直接初始化 model.put("key", "value"); return "viewName"; }
自动封装属性
http://localhost:8080/springmvc/testMethod.do?name=xxx&pass=xxx
User类里有name,pass属性:
Controller类里的方法:
@RequestMapping("/testMethod") public void testMethod(User user){ //这里会自动给user的name,pass赋值 //User:为commend对象,领域模型 System.out.println(user); } @RequestMapping("/testMethod") public void testMethod(User user,BindingResult result){ //BindingResult:用于验证对象绑定结果,把绑定过程出错的地方用在result里。如果不想处理错误绑定,则不需要指定 System.out.println(user); }
基于配置文件的SpringMVC处理请求的方法定义总结:
public (ModelAndView | Map | String | void) actionName(HttpServletRequest request, HttpServletResponse response, [,HttpSession] [,AnyObject]);
参数类型:
1.HttpServletRequest(必须有)
2. HttpServletRespons(必须有)
3。HttpSession(可选)
4.AnyObject(可选)
备注:如果object与session都有,则session应为第三个参数
返回值类型:
1,ModelAndView
2.Map
3.String
4.void
基于注解的MVC,能够处理请求的方法定义总结:
参数类型:对数量及顺序是没有要求的
1,可以没有();
2,可以是HttpServletRequest
3,可以是HttpServletResponse
4,可以是HttpSession
5,可以是路径变量@PathVariable
6,可以是@RequestParam
7,可以是@CookieValue
8,可以是@RequestHeader
9,可以是PrintWriter
10,可以是Map model
11,可以是领域模型对象
备注:HttpSessiond需要有一个前提条件,那就是当前请求的session可用:即在这之前session已经被初始化:也就是说在这之前调用了request.getSession()或者session.setAttribute(),直接进入jsp页面,也会初始化session
返回值类型:
1,ModelAndView
2.Map
3.String:代表了viewName,model也会自动返回
4.void:一般使用out方法输出之后就用void
5.AnyType:返回任意类型的对象
6.List
@RequestMapping("/xxx") public void testVoid(){ //如果没有使用out对象,则会隐含默认生成一个viewName--:是按请求路径解析出来的 //如:请求路径为:http://localhost:8080/springmvc/test/xxx.do,则生成的视图名为test/xxx // /WEB-INF/page/test/xxx.jsp System.out.println("..."); } //返回任意对象 @RequestMapping("/xxx") public User test(){//相当于model里添加了一个 model.put("key","value"),key:为默认类名(user),value为返回的对象 return null; //视图名与void时一样:则会隐含默认生成一个viewName--:是按请求路径解析出来的 //如:请求路径为:http://localhost:8080/springmvc/test/xxx.do,则生成的视图名为test/xxx // /WEB-INF/page/test/xxx.jsp } 返回List @RequestMapping("/xxx") public List<User> query(){ return null; //list也会加入到model里,默认key是实际成员的名+List如:model("userList",user). } 可以使用EL表达式取里面的值:${userList},也可以request.getAttribute("userList") ##############annotation注解方式实现 结束###################
Spring MVC 常用 ViewResolver & View
@、 InternalResourceViewResolver、 UrlBasedViewResolver
@、Redirect 重定向视图 (redirect:)
@、XmlViewResovler
@、视图链
@、JstlView, ExcelView及自定义view (JsperReport, Pdf, Excel)
重定向视图:
防止重复提交,可以使用重定向
@RequestMapping(method=RequestMethod.POST)
public String addUser(User user){
return "redirect:/add_success";
}
#######拦截器,视图国际化,验证############################
拦截器:inteceptor
全局日志,权限管理
1.定义拦截器:
package test.web; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; public class MyInteceptor implements HandlerInterceptor{ public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { } //控制器已经执行完,生成视图之前可以做的操作,通常是向模型中加入一些公共成员 public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception { } public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object handler) throws Exception { //handler:指的是下一个对象的引用,如果是有两个拦截器,这就是指第二个拦截器对象,最后一个就是Controller return false; //return true:表示继续执行,false:表示直接中断,不会再执行之后的操作 } }
springmvc-servlet.xml
<?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:p="http://www.springframework.org/schema/p" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/mvc http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"> <!-- 基于注解的方式 --> <context:component-scan base-package="test.controller"/> <!-- InternalResourceViewResolver:是在基于url的基础之上,加入了JSP,JSTL的视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <property name="prefix" value="/pages"/> <property name="suffix" value=".jsp"></property> </bean> <mvc:inteceptors> <mvc:inteceptor> <!-- path如果不指定,则对所有的请求都拦截 <mvc:mapping path=""/>--> <!-- 表示符合/user/*这样的模式才拦截 --> <mvc:mapping path="/user/*"/> <bean class="test.web.MyInteceptor"></bean> </mvc:inteceptor> <!-- 可以定义多个inteceptor,按顺序执行 --> </mvc:inteceptors> </beans>
国际化ResourceMessage
在根路径下建立资源文件:
mess.properties
mess_en_US.properties
mess_zh_CN.properties
分别定义如下:
welcome="welcome"
welcome="(US)welcome"
welcome="欢迎你!"
jsp页面里,使用<spring:message/>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib uri="http://www.springframework.org/tags" prefix="spring"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <body><!-- 国际化的key为welcome --> <spring:message code="welcome"/><br> </body> </html>
加载国际化资源文件,需要在springmvc-servlet.xml里配置
如下:
<?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:p="http://www.springframework.org/schema/p" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/mvc http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"> <!-- 基于注解的方式 --> <context:component-scan base-package="test.controller"/> <!-- InternalResourceViewResolver:是在基于url的基础之上,加入了JSP,JSTL的视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <property name="prefix" value="/pages"/> <property name="suffix" value=".jsp"></property> </bean> <!-- 加载国际化配置,这里定义的id名必须为 messageSource--> <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <!-- 根名称:去掉多语言后的名称,如这里的 mess,为在当前classpath里去找mess国际化配置文件 --> <property name="basename" value="mess"></property> <!-- 如果有多组国际化文件,可以指定basenames,它是一个list,配置如下 --> <property name="basenames"> <list> <value>mess1</value> <value>mess2</value> <value>....</value> </list> </property> </bean> </beans>
JSR-303 validate bean 验证
如:User类里
public class User { @NotEmpty private String name; @Size(max=20,min=6) private String pass; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPass() { return pass; } public void setPass(String pass) { this.pass = pass; } }
然后在Controller里
@RequestMapping("/testMethod") public void testMethod(@Valid User user,BindingResult result){ if(result.hasErrors()){ return "error"; } System.out.println(user); }
在参数里加@Valid注解,就会当这个user进行绑定的时候,就验证,验证的规则定义在User类里,如果验证过程出错,就会把错误信息放在BindingResult里
发表评论
-
Springmvc3实现文件上传
2011-09-23 17:48 4000Spring自己封装了文件上传功能,可以利用 Multipar ... -
springmvc+dwz+xheditor实现上传图片及swf 视频
2011-09-23 17:30 6763注意:如果使用了apache fileupload上传方法,则 ... -
dwz+jquery+fileupload+springmvc实现文件上传 及图片预览
2011-09-23 17:01 80071 前台jsp:文件的上传利用了iframe实现局部刷新功能。 ... -
dwr spring整合
2011-03-18 13:50 798Ajax,它使浏览器可以为 ...
相关推荐
springmvc学习笔记
个人学习spring框架时记录的笔记,纯手敲,SpringIOC+SpringMVC学习笔记,有兴趣的可以参考
SpringMVC是Java web开发中一个非常重要的框架,它基于模型-视图-控制器(Model-View-Controller)设计模式...这份“SpringMVC学习笔记”包括了从基础到进阶的全面内容,旨在帮助读者从零开始掌握SpringMVC的各个方面。
SpringMVC学习笔记.md
狂神说Java——SpringMVC学习笔记 内容概要: 1、了解什么是SpringMVC 2、RestFul和控制器 3、转发和重定向 4、数据处理 5、JSON 6、SSM项目整合 7、Ajax 8、拦截器+文件上传下载 能学到什么:详细了解SpringMVC基础...
**SpringMVC 学习笔记一** 在Java Web开发领域,SpringMVC是Spring框架的一个重要组成部分,它是一个用于构建Web应用程序的Model-View-Controller(MVC)框架。本学习笔记将深入探讨SpringMVC的基本概念、核心组件...
SpringMVC 学习笔记涵盖了从基础到高级的多个方面,如源码分析、实例代码、Maven 配置、Web.xml 配置以及注解驱动的编程。对于初学者来说,理解 SpringMVC 的工作流程至关重要。SpringMVC 的工作流程通常始于浏览器...
这个“springmvc学习笔记.zip”文件很可能包含了关于如何理解和使用SpringMVC的详细教程或个人学习记录。以下是一些核心知识点的详细说明: 1. **MVC架构**:MVC是一种设计模式,将应用程序分为三个主要组件:模型...
在"springmvc学习笔记--springmvc注解开发.zip"这个压缩包中,我们可以深入探讨Spring MVC的注解驱动开发方式,这是一种简洁且高效的开发模式。 1. **Spring MVC基础**: Spring MVC的核心组件包括...
总的来说,这份"SpringMVC学习笔记+学习源码.zip"资源涵盖了SpringMVC的基本概念、配置、控制器、数据绑定、异常处理、视图解析等多个方面的内容,对于初学者和有一定经验的开发者都是很好的学习资料。通过深入学习...
【标题】"mybatis,springmvc学习笔记"涵盖了两个核心的Java Web开发框架:MyBatis和Spring MVC。这两个框架在现代企业级应用中扮演着重要角色,它们各自解决了不同的问题,但通常会结合使用以构建高效、灵活的后端...
**SpringMVC学习笔记(一)** 在Java Web开发领域,SpringMVC是Spring框架的一个重要组成部分,用于构建高效、可维护的Web应用程序。本文将深入探讨SpringMVC的基础概念、工作原理及其核心组件,帮助你更好地理解和...
### SpringMVC学习笔记 #### 一、SpringMVC概述 **1.1 什么是SpringMVC** SpringMVC作为Spring Framework的一个重要组成部分,主要针对Web应用开发提供了一个功能全面的MVC(Model-View-Controller)框架。它是...
**SpringMVC学习笔记** SpringMVC是Spring框架的一个模块,专为构建Web应用程序而设计。它是一个基于模型-视图-控制器(MVC)架构的轻量级Java Web开发框架,提供了处理HTTP请求、数据绑定、验证以及与后端服务交互...
笔记全部以Markdown的形式记录,源码包含一个项目,可以非常便捷的帮助大家上手实践笔记中的知识点学习建议:本笔记为SSM框架一部分,大家可以优先学习Spring等框架,学习完成后在进行SpringMVC的学习系列所有笔记都...