前言:
而今咱们对“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> <!—这里的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=""> <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—>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" />
<!—这里 没有 <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传值乱码