龙空技术网

SpringMVC个人学习笔记

动作要快姿势要帅 337

前言:

而今咱们对“jqueryajax传值乱码”可能比较关切,朋友们都想要了解一些“jqueryajax传值乱码”的相关文章。那么小编同时在网摘上网罗了一些有关“jqueryajax传值乱码””的相关文章,希望大家能喜欢,同学们一起来了解一下吧!

springMVC 笔记

第一、二课

所需jar包,本次使用版本是spring3.2.3

Ps:spring的文件用上面的基本够了,但是整个过程可能需要很多的commons软件,如fileupload,io,lang包

SpringMVC demo案例

1、加入相关jar包

2、web.xml配置

<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> 这里一定要写成这样,如果写成 /* 输入地址总是No mapping found for HTTP request with URI

</servlet-mapping>

Ps:springMVC 也有个默认的xml配置文件,类似struts2的struts.xml

该文件可以指定,即上面紫色注释掉部分。

默认路径是 /WEB-INF/springMVC-servlet.xml

3、springMVC-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns=""

xmlns:xsi=""

xmlns:mvc=""

xmlns:context=""

xsi:schemaLocation="

">

<bean name="/helloword" class="com.wang.web.controller.HelloworldController"></bean>

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">

<property name="prefix" value="/"></property>

<property name="suffix" value=".jsp"></property>

</bean>

</beans>

4、编写controller

该controller类似struts2的action,编写的controller 要实现

org.springframework.web.servlet.mvc.Controller 接口

第三课

springMVC的传值

通过modelandview 传值

1、

@Override

public ModelAndView handleRequest(HttpServletRequest request,

HttpServletResponse response) throws Exception {

return new ModelAndView("/hello","result","this is the result!");

}

页面上直接EL表达式显示值

传递MAP

第四课

springMVC一个controller写多个方法

1、 Controller 类 继承 MultiActionController 类

public class MultiMethodController extends MultiActionController{

public ModelAndView add(HttpServletRequest request,HttpServletResponse response){

return new ModelAndView("/multiAdd");

}

2、 Xml配置文件

<!-- 配置单controller 多个方法 多请求处理控制器-->

<bean id="paramMethodResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">

<property name="paramName" value="method"></property> <!&mdash;这里的method url使用 -->

</bean>

<!--配置对应的controller -->

<bean name="/multiMethod" class="com.wang.web.controller.MultiMethodController">

<property name="methodNameResolver" ref="paramMethodResolver" />

</bean>

3、 URL路径

ps:controller 类中的方法都要是xxx(HttpServletRequest request,HttpServletResponse response)

第五课

SpringMVC静态文件访问

在现有的配置下 在jsp 文件中 <img src="xx/xx/xx.png" /> 无法显示图片

解决方法:

在 springMVC的xml配置文件中加上

<!-- 访问静态文件 -->

<mvc:resources location="/img/" mapping="/img/**"/>

以后所有的静态文件,如js,css,html,video等均可以放置在一个统一的文件夹下。可以配置多个

原因:springMVC 的DispatcherServlet 这个时候全部给过滤了。同时也把所有的静态文件给拦截了。

<servlet-mapping>

<servlet-name>springMVC</servlet-name>

<url-pattern>/</url-pattern>

</servlet-mapping>

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">

<property name="prefix" value="/"></property>

<property name="suffix" value=".jsp"></property>

</bean>

所以本质上url

他会把img.jpg当成img.jpg.jsp

另一种解决方法:

<url-pattern>*.action</url-pattern>

第六课 (开始Annotation)

springMVC注解启用

spring xml 配置

<mvc:annotation-driven />

<context:component-scan base-package="com.wang" />

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>

(该类已经废弃了,使用下面的代替)

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" />

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">

<property name="prefix" value="/"></property>

<property name="suffix" value=".jsp"></property>

</bean>

<mvc:resources location="/framework/" mapping="/framework/**"/>

Ps:黄色部分是添加扫描和spring 的annotation所必须的。<mvc:annotation-driven />

要么使用 都是绿色背景的,要么使用灰色的,不要重复使用。

使用RequestMappingHandlerMapping,就要使用<mvc:annotation-driven /> 不然会报错

No adapter for handler [xx.xx.xx.XxController@dbb9b9]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler

2、controller

@Controller

public class UserController {

@RequestMapping(value={"/user/useradd"},method={RequestMethod.GET,RequestMethod.POST})

public ModelAndView insert(){

return new ModelAndView("/hello");

}

}

第七课

Annotation 配置的优化

1、原先的都是@RequestMapping(value={"/user/useradd"} ,该注解都是在方法上,该注解也可以放在类上

@Controller

@RequestMapping(value="/user")

public class UserController {

@RequestMapping(value={"/useradd"},method={RequestMethod.GET,RequestMethod.POST})

public ModelAndView add(){

return new ModelAndView("/hello","result","method----add");

}

@RequestMapping(value={"/userdel"},method={RequestMethod.GET,RequestMethod.POST})

public ModelAndView del(){

return new ModelAndView("/hello","result","method----del");

}

}

这样就是把相同的的路径给提取出来,在类上把根路径写好。原则就是该@RequestMapping 就是类名去掉后面的Controller,method 属性最好不用配置

2、不使用ModelAndView 作为方法的返回值

SpringMVC 的灵活强大之处的体现。

Controller 中方法如果需要request,就在方法中添加该参数;需要response 同样添加该参数;如果都需要,都添加

Pl:主要看例子方法的参数,任意个均可。

@Controller

@RequestMapping("/user2")

public class User2Controller {

@RequestMapping(value={"/useradd"},method={RequestMethod.GET,RequestMethod.POST})

public String add(HttpServletRequest request){

System.out.println(request.getServletPath());

return "/hello";

}

@RequestMapping(value={"/userdel"})

public String del(HttpServletResponse response){

System.out.println(response.getStatus());

return "/hello";

}

@RequestMapping(value={"/userupdate"})

public String update(HttpServletRequest request,HttpServletResponse response){

System.out.println(request.getServletPath());

System.out.println(response.getStatus());

request.setAttribute("result", "method----update");

return "/hello";

}

}

第八课

参数传递

Jboss as 7之后中文乱码的解决

1、jboss-eap-6.2\standalone\configuration\standalone.xml

在该文件 </extensions> 后添加

<system-properties>

<property name="org.apache.catalina.connector.URI_ENCODING" value="UTF-8"/>

<property name="org.apache.catalina.connector.USE_BODY_ENCODING_FOR_QUERY_STRING" value="true"/>

</system-properties>

2、web.xml使用spring 的filter

<!-- 编码过滤器 -->

<filter>

<filter-name>encodingFilter</filter-name>

<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>

<init-param>

<param-name>encoding</param-name>

<param-value>UTF-8</param-value>

</init-param>

<init-param>

<param-name>forceEncoding</param-name>

<param-value>true</param-value>

</init-param>

</filter>

<filter-mapping>

<filter-name>encodingFilter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

第九、十课

SpringMVC和json结合传递数据

SpringMVC的 model 传值

1、model 类

public class User {

private String userName;

private String age;

private String userCode;

public String getUserCode() {

return userCode;

}

public void setUserCode(String userCode) {

this.userCode = userCode;

}

public String getUserName() {

return userName;

}

public void setUserName(String userName) {

this.userName = userName;

}

public String getAge() {

return age;

}

public void setAge(String age) {

this.age = age;

}

}

2、页面

姓名:<input type="text" name="userName" value="${userName}"> <Br/>

年龄:<input type="text" name="age" value="${age }"> <br/>

3、接收值的controller

@RequestMapping(value={"/useradd"})

public String add(HttpServletRequest request,User user,String username,String age){

return "/hello";

}

Ps:这里和struts2 有些区别

Sturs2 传值页面

<input type="text" name="user.userName" value="">

Action类用有个user 类即可

但是在springMVC中 还写成 实例名.属性 是获取不到值的

而且 springMVC中

public String add(HttpServletRequest request,User user,String username,String age)

user,username,age都有值

jQuery ajax 调用后台

$("#jsonbt").click(function(){

var userName = $("#userName").val();

var age = $("#age").val();

//alert(userName+" "+age);

var user = {userName:userName,age:age};

$.ajax({

url:"/springMVC/user2/useradd",

type:"get",

data:user,

success:function(data){

alert(data);

}

});

}

);

第十一、二课

SpringMVC文件上传

1、配置文件

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

<property name="defaultEncoding" value="utf-8" />

<property name="maxUploadSize" value="10485760" />

<property name="maxInMemorySize" value="20480" /><!-- 是否使用缓存 -->

</bean>

2、jsp

<form id="fm" action="/springMVC/fileUpload/addfile" method="post" enctype="multipart/form-data">

<input type="file" name="myfile" value=""> &nbsp;&nbsp;&nbsp;<input type="button" id="submit1" value="提交" />

<input type="submit" value="submit">

</form>

Ps:不管是struts还是spring 文件上传都是采用

enctype="multipart/form-data"

3、controller

@Controller

@RequestMapping("/fileUpload")

public class FileUploadController {

@RequestMapping("/addfile")

public void addFile(@RequestParam("myfile") CommonsMultipartFile file){

System.out.println(file.getOriginalFilename());

System.out.println(file.getName());

System.out.println(file.getSize());

System.out.println(file.getStorageDescription());

System.out.println(file.getFileItem().isFormField());

System.out.println(file.getContentType());

}

}

Ps:

1、 如果不加@RequestParam("myfile")会报错。 myfile 是jsp页面上 name="myfile"

2、 CommonsMultipartFile是MultipartFile子类,所以该处也能换成 MultipartFile

CommonsMultipartFile 获取的部分数据如下:

另一种上传的方法:

使用CommonsMultipartResolver ,MultipartRequest,MultipartFile

@RequestMapping("/addfile2")

public void addFile(HttpServletRequest request,HttpServletResponse response){

CommonsMultipartResolver resolver = new CommonsMultipartResolver(request.getSession().getServletContext());

if(resolver.isMultipart(request)){ // 如果上传的东西有值,则为真

MultipartRequest mprequest = (MultipartRequest)request;

MultipartFile mlfile = mprequest.getFile("myfile");

System.out.println(mlfile.getOriginalFilename());

try {

mlfile.transferTo(new File(""));

} catch (IllegalStateException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

//do something ...

}

}

第十三、四课

Springmvc和spring的集成

Web.xml中启动顺序

listener&mdash;>filter-->servlet

第十五课

Spring 和springMVC context

//spring context 指拿到applicationContext.xml内容

WebApplicationContext wc1 = WebApplicationContextUtils.getWebApplicationContext(request.getServletContext());

//springMVC context 指拿到springMVC-servlet.xml内容

WebApplicationContext wc2 = RequestContextUtils.getWebApplicationContext(request);

Springmvc 的context 继承了 spring的context

第十六课

Spring拦截器

Spring为我们提供了:

org.springframework.web.servlet.HandlerInterceptor接口,

org.springframework.web.servlet.handler.HandlerInterceptorAdapter适配器类,

实现这个接口或继承此类,可以非常方便的实现自己的拦截器。

有以下三个方法:

Controller之前执行:

public boolean preHandle(HttpServletRequest request,

HttpServletResponse response, Object handler) throws Exception

生成视图之前执行

public void postHandle(HttpServletRequest request,

HttpServletResponse response, Object handler,

ModelAndView modelAndView) throws Exception;

最后执行,可用于释放资源

public void afterCompletion(HttpServletRequest request,

HttpServletResponse response, Object handler, Exception ex) throws Exception

分别实现预处理、后处理(调用了Service并返回ModelAndView,但未进行页面渲染)、返回处理(已经渲染了页面)

Ps:在preHandle中,可以进行编码、安全控制等处理;

在postHandle中,有机会修改ModelAndView;

在afterCompletion中,可以根据ex是否为null判断是否发生了异常,进行日志记录。

参数中的Object handler是下一个拦截器。

实现接口的方法

public class MyInterceptor implements HandlerInterceptor{

/**方法中的Object handler 指下一个interceptor*/

@Override

public boolean preHandle(HttpServletRequest request,

HttpServletResponse response, Object handler) throws Exception {

return false;

}

@Override

public void postHandle(HttpServletRequest request,

HttpServletResponse response, Object handler,

ModelAndView modelAndView) throws Exception {

}

@Override

public void afterCompletion(HttpServletRequest request,

HttpServletResponse response, Object handler, Exception ex)

throws Exception {

}

}

继承类的方法

继承HandlerInterceptorAdapter(参考源码) ,该类的所有方法都是空实现。根据自己的需要重写方法。

如何使用拦截器?

Spring MVC并没有总的拦截器,不能对所有的请求进行前后拦截。

Spring MVC的拦截器,是属于HandlerMapping级别的,可以有多个HandlerMapping ,每个HandlerMapping可以有自己的拦截器。

当一个请求按Order值从小到大,顺序执行HandlerMapping接口的实现类时,哪一个先有返回,那就可以结束了,后面的HandlerMapping就不走了,本道工序就完成了。就转到下一道工序了。

拦截器会在什么时候执行呢? 一个请求交给一个HandlerMapping时,这个HandlerMapping先找有没有处理器来处理这个请求,如何找到了,就执行拦截器,执行完拦截后,交给目标处理器。

如果没有找到处理器,那么这个拦截器就不会被执行。

在spring MVC的配置文件中配置有三种方法:

1、(近似)总拦截器,拦截所有url(常用)

<mvc:interceptors>

<bean class="com.wang.web.controller.MyInterceptor" />

</mvc:interceptors>

为什么叫"近似",前面说了,Spring没有总的拦截器。

<mvc:interceptors/>会为每一个HandlerMapping,注入一个拦截器。总有一个HandlerMapping是可以找到处理器的,最多也只找到一个处理器,所以这个拦截器总会被执行的。起到了总拦截器的作用。

如果是REST风格的URL,静态资源也会被拦截。

2、 (近似) 总拦截器, 拦截匹配的URL(常用)

<mvc:interceptors >

<mvc:interceptor>

<mvc:mapping path="/user/*" /> <!-- /user/* -->

<bean class="com.mvc.MyInteceptor"></bean>

</mvc:interceptor>

</mvc:interceptors>

就是比 方案一多了一个URL匹配。

如果是REST风格的URL,静态资源也会被拦截。

3、HandlerMappint上的拦截器,注入类中(少用)

如果是REST风格的URL,静态资源就不会被拦截。因为我们精准的注入了拦截器。

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">

<property name="interceptors">

<list>

<bean class="com.mvc.MyInteceptor"></bean>

</list>

</property>

</bean>

在 DefaultAnnotationHandlerMapping没有被废弃前出现问题:

如果使用了<mvc:annotation-driven />,它会自动注册DefaultAnnotationHandlerMapping 与AnnotationMethodHandlerAdapter 这两个bean,所以就没有机会再给它注入interceptors属性,就无法指定拦截器。

当然我们可以通过人工配置上面的两个Bean,不使用 <mvc:annotation-driven />,就可以 给interceptors属性 注入拦截器了。

使用 <mvc:annotation-driven />,而建议手动写详细的配置文件,来替代 <mvc:annotation-driven />,这就控制力就强了。

Ps:

1、使用

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"></bean>

不使用<mvc:annotation-driven /> 能正常访问Controller,上面3中使用拦截器的方法都可以用, 但是在spring3.2.3中DefaultAnnotationHandlerMapping已经废弃了,而是改用RequestMappingHandlerMapping 。

2、使用

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" />

使用该类,就必须使用<mvc:annotation-driven /> 不然会报错

javax.servlet.ServletException: No adapter for handler [public org.springframework.web.servlet.ModelAndView com.wang.web.controller.UserController.add()]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler

那拦截器的使用只能用前2中方法。

建议使用后者:

springMVCAnnotation-servlet.xml 文件

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns=""

xmlns:xsi=""

xmlns:mvc=""

xmlns:context=""

xsi:schemaLocation="

">

<context:component-scan base-package="com.wang" />

<mvc:annotation-driven />

<!-- 定义拦截器 -->

<mvc:interceptors>

<bean class="com.wang.web.controller.MyInterceptor2"></bean>

<bean class="com.wang.web.controller.MyInterceptor"></bean>

</mvc:interceptors>

<!-- 过滤静态文件,不然显示不出来 -->

<mvc:resources location="/framework/" mapping="/framework/**"/>

<!-- annotation 使用 -->

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" />

<!-- 对模型视图名称的解析,即在模型视图名称添加前后缀 -->

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">

<property name="prefix" value="/"></property>

<property name="suffix" value=".jsp"></property>

</bean>

<!-- 文件上传 -->

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

<property name="defaultEncoding" value="utf-8" />

<property name="maxUploadSize" value="10485760" />

<!-- 是否使用缓存 -->

<property name="maxInMemorySize" value="20480" />

</bean>

</beans>

另外一种,仅供了解

springMVCAnnotation-servlet-old.xml (部分)

<beans>

<context:component-scan base-package="com.wang" />

<!&mdash;这里 没有 <mvc:annotation-driven />-->

<!-- 定义拦截器 -->

<!-- <mvc:interceptors>

<bean class="com.wang.web.controller.MyInterceptor2"></bean>

<bean class="com.wang.web.controller.MyInterceptor"></bean>

</mvc:interceptors> -->

<!-- annotation 使用 -->

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">

<property name="interceptors">

<list>

<bean class="com.wang.web.controller.MyInterceptor2" />

<bean class="com.wang.web.controller.MyInterceptor" />

</list>

</property>

</bean>

</beans>

第十七课

I18N

浏览器级别的国际化

1、springMVCAnnotation-servlet.xml 配置

<!-- 资源文件绑定器 -->

<bean id="messageSource"

class="org.springframework.context.support.ResourceBundleMessageSource">

<property name="basename" value="i18n.resource" /> <!--//这里定义资源文件的的路径,分隔符可以是 "."或者"/" ,跟struts2是一样的。默认是在classpath下。I18n 是路径,resource 是资源文件前缀名-->

<property name="useCodeAsDefaultMessage" value="true" />

</bean>

2、jsp页面调用

Jsp页面使用JSTL 的<fmt:message />标签 获取。

使用fmt 需要引入jstl jar包

<%@taglib prefix="fmt" uri="" %>

<fmt:message key="common.word" />

也可以使用springMVC 标签

<%@ taglib prefix="spring" uri=""%>

<spring:message code="common.word" />

Ps:fmt 补充

fmt bundle标签、message标签

作用:加载指定的.properties文件,并获取指定的属性。

<fmt:bundle basename="i18n/resource_en_US">

<fmt:message key="common.running"></fmt:message>

</fmt:bundle>

带前缀的

<fmt:bundle basename="i18n/resource_en_US" prefix="common.">

<fmt:message key="running"></fmt:message>

</fmt:bundle>

Java Controller中使用资源文件

//spring context 指拿到applicationContext.xml内容

WebApplicationContext wc1 = WebApplicationContextUtils.getWebApplicationContext(request.getServletContext());

//springMVC context 指拿到springMVC-servlet.xml内容

WebApplicationContext wc2 = RequestContextUtils.getWebApplicationContext(request);

MessageSource resources = new ClassPathXmlApplicationContext("springMVC/springMVCAnnotation-servlet.xml");

String message = resources.getMessage("common.word", null, "Default", Locale.US);

System.out.println(message);

System.out.println(wc2.getMessage("common.word", null,

Locale.SIMPLIFIED_CHINESE));

继承extends MultiActionController

WebApplicationContext wc3 = this.getWebApplicationContext();

System.out.println(wc3.getMessage("common.word", null,

Locale.SIMPLIFIED_CHINESE));

该方法是参考struts2 继承 actionSupport 想到的

标签: #jqueryajax传值乱码