02基于注解开发SpringMVC项目(jar包,异步,request,参数传递,多选的接收,Model传参,map传参,model传参,ajax,重定向,时间日期转换)
1 所需jar包
项目结构如下:
2 web.xml配置文件的内容如下:
<?xmlversion="1.0"encoding="UTF-8"?> <web-appversion="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <!-- struts用/*,springmvc不能用/*方式,配置的url-pattern如:*.xxx --> <url-pattern>*.do</url-pattern> </servlet-mapping> </web-app> |
3 springmvc-servlet.xml的内容如下:
<?xmlversion="1.0"encoding="UTF-8"?> <beansxmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd "> <context:component-scanbase-package="com.rl.controller"/> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <propertyname="prefix"value="/WEB-INF/jsp/"/> <propertyname="suffix"value=".jsp"/> </bean> <!--文件上传的视图解析器 id一定是multipartResolver,不能随便定义 --> <beanid="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!--文件上传的最大值,以字节为单位 --> <propertyname="maxUploadSize"value="1024000"></property> </bean> <mvc:interceptors> <mvc:interceptor> <!-- path:指定要拦截的范围。语法:/(根目录)test/**,所有拦截/** --> <mvc:mappingpath="/**"/> <beanclass="com.rl.interceptor.MyInterceptor"/> </mvc:interceptor> </mvc:interceptors> </beans> |
4 Test1Controller.java的内容如下:
package com.rl.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller @RequestMapping("/test1") //当前Controller的namespace,防止不同的Controller中方名重复的问题 public class Test1Controller { /** * 浏览器中的访问地址是:http://localhost:8080/springmvc2/test1/toAjax.do * @return */ @RequestMapping("/toAjax.do") public String toAjax() { return "ajax"; } } |
5 TestController的内容如下:
package com.rl.controller; import java.io.IOException; import java.io.PrintWriter; import java.sql.Date; import java.text.SimpleDateFormat; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.beans.propertyeditors.CustomDateEditor; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.ServletRequestDataBinder; import org.springframework.web.bind.annotation.InitBinder; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView; import com.rl.model.Person; import com.rl.model.User; @Controller @RequestMapping("test") //当前Controller的namespace,防止不同Controller中方法名重复的问题 public class TestController { public TestController() { System.out.println("Controller被创建...."); } /** * desc:返回值类型是String,含义是ModelAndView中的viewname * * @RequestMapping:请求方法的映射,内容最好和方法名称一致 * @author 涂作权 * @return */ @RequestMapping("/hello.do") public String hello() { return "index"; } /** * desc:HttpServletRequest可以直接定义在方法的参数列表中来使用 * * @param request * @author 涂作权 * @return */ @RequestMapping("/getParam.do") public String getParam(HttpServletRequest request) { String name = request.getParameter("name"); System.out.println(name); return "index"; } /** * desc:在参数的列表中来直接定义要接收的参数,参数名(形象)一定要 * 和请求中传递的参数名(实参)一致,数据类型会自动的转换,如果数据 * 类型转换出错会报400错误??? * * @param name * @param id * @param age * @param address * @param birthday * @author 涂作权 * @return */ @RequestMapping("/getParam1.do") public String getParam1(String name, Integer id, Integer age, String address, Date birthday) { System.out.println("姓名:" + name + " id:" + id.getClass() + " 年龄:" + age + " 地址: " + address + "生日:" + birthday); return "index"; } /** * desc:多选的接收在参数列表中定义数组来接收,参数名(形参)一定要和请求中传递的参数名(实参)一致,数据类型会自动的转换, * 如果以字符串来接收的话会接收到一个以逗号分隔的一个字符串 * * @author 涂作权 * @param favor * @return */ @RequestMapping("/getParam2.do") public String getParam2(String[] favor) { System.out.println(favor); for (String fa : favor) { System.out.println(fa); } return "index"; } /** * desc:接收实体对象,直接在参数列表中定义要接收的实体类就可以了,每次访问的时候springmvc会自动创建相关参数的实体对象,对象中 * 的属性值是通过请求传递过来并且注入到对象中 * * @author 涂作权 * @param person * @param user * @param name * @return */ @RequestMapping("/getParamByObj.do") public String getParamByObj(Person person, User user, String name) { System.out.println(person); System.out.println(user); return "index"; } /** * 不建议使用 desc:返回值类型定义成ModelAndView,把数据和视图注入到ModelAndView中返回即可 * * @return * @author 涂作权 * @throws Exception */ @RequestMapping("/returnData.do") public ModelAndView returnData() throws Exception { Person p = new Person(); p.setId(1); p.setName("zhangsan"); p.setAge(22); p.setAddress("beijing"); p.setBirthday(new SimpleDateFormat("yyyy-MM-dd").parse("2013-08-05")); Map<String, Object> map = new HashMap<String, Object>(); // 相当于request.setAttribute("person", p); map.put("person", p); return new ModelAndView("index", map); } /** * 不建议使用 desc:返回值是String类型:viewName,参数是map,是ModelAndView中 map,不是接收参数的。 * * @author 涂作权 * @param map * @return * @throws Exception */ @RequestMapping("/returnData1.do") public String returnData1(Map<String, Object> map) throws Exception { Person p = new Person(); p.setId(1); p.setName("zhangsan"); p.setAge(22); p.setAddress("beijing"); p.setBirthday(new SimpleDateFormat("yyyy-MM-dd").parse("2013-08-05")); // 相当于request.setAttribute("person", p); map.put("person", p); return "index"; } /** * 在参数列表中定义Model来给页面返回数据 desc:建议使用 * * @author 涂作权 * @param model * @return * @throws Exception */ @RequestMapping("/returnData2.do") public String returnData2(Model model) throws Exception { Person p = new Person(); p.setId(1); p.setName("zhangsan"); p.setAge(22); p.setAddress("beijing"); p.setBirthday(new SimpleDateFormat("yyyy-MM-dd").parse("2013-08-05")); // 相当于request.setAttribute("person", p); model.addAttribute("person", p); return "index"; } /** * desc:method=RequestMethod.POST该方法只能使用method指定的请求方式来指定 */ @RequestMapping(value = "/getParamByObjWithMethod.do", method = RequestMethod.POST) public String getParamByObjWithMethod(Person person) { System.out.println(person); return "success"; } /** * desc:在参数列表中直接来定义HttpServletResponse,并且方法的返回值要定义void为ajax提供调用 * * @author 涂作权 * @param name * @param response */ @RequestMapping("/ajax.do") public void ajax(String name, HttpServletResponse response) { String result = "hello" + name; try { response.getWriter().write(result); } catch (IOException e) { e.printStackTrace(); } } /** * desc:直接在参数列表中来定义PrintWriter建议使用 * * @param name * @param out */ @RequestMapping("/ajax1.do") public void ajax1(String name, PrintWriter out){ String result = "hello " + name; out.write(result); } @RequestMapping("/toAjax.do") public String toAjax(){ return "ajax"; } /** * 在同一个Controller中重定向语法 return后面 redirect:当前 * Controller中方法的@RequestMapping的值 * * @return */ @RequestMapping("/redirectToAjax.do") public String redirectToAjax(){ return "redirect:toAjax.do"; } /** * controller之间的重定向redirect:后面要有"/",代表从项目的根目录开始 * * @return * @author 涂作权 */ @RequestMapping("/redirectToAjax1.do") public String redirectToAjax1(){ return "redirect:/test1/toAjax.do"; } /** * 单纯的转发 * * @author 涂作权 * @return */ @RequestMapping("/toForm.do") public String toForm(){ return "form"; } /** * 用于转换数据类型 * @param binder */ @InitBinder public void initBinder(ServletRequestDataBinder binder){ binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true)); } } |
6 UploadController的内容如下:
package com.rl.controller; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Random; import javax.servlet.http.HttpServletRequest; import org.springframework.beans.propertyeditors.CustomDateEditor; import org.springframework.stereotype.Controller; import org.springframework.web.bind.ServletRequestDataBinder; import org.springframework.web.bind.annotation.InitBinder; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest; import com.rl.model.Person; @Controller @RequestMapping("/upload") //当前Controller的namespace,防止不同Controller中方法名重复的问题 public class UploadController { @RequestMapping("/uploadPic.do") public String uploadPic(Person person, HttpServletRequest request) throws Exception { // 把request转换成MultipartHttpServletRequest MultipartHttpServletRequest mr = (MultipartHttpServletRequest) request; // 获得文件,这里的pic是表单中的file字段对应的属性名称 MultipartFile mf = mr.getFile("pic"); // 获得文件的字节数组 byte[] fbyte = mf.getBytes(); // 获得当前时间的最小精度 String fileName = new SimpleDateFormat("yyyyMMddHHmmssSSS") .format(new Date()); // 追加三位随机数 Random random = new Random(); for (int i = 0; i < 3; i++) { fileName = fileName + random.nextInt(10); } // 获得原始文件名 String oriFileName = mf.getOriginalFilename(); // 获得后缀名 String suffix = oriFileName.substring(oriFileName.lastIndexOf(".")); // 拿到服务器的根目录 String realPath = request.getSession().getServletContext() .getRealPath("/"); // 创建文件输出流 OutputStream out = new FileOutputStream(new File(realPath + "/upload/" + fileName + suffix)); out.write(fbyte); out.flush(); out.close(); return "success"; } @InitBinder public void initBinder(ServletRequestDataBinder binder) { binder.registerCustomEditor(Date.class, new CustomDateEditor( new SimpleDateFormat("yyyy-MM-dd"), true)); } } |
7 MyInterceptor的内容如下:
package com.rl.interceptor; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; public class MyInterceptor implements HandlerInterceptor{ /** * 执行时机:在视图解析器解析完毕之后,页面一旦报错异常会抛到该方法中, * try{}catch后面的finally,用于系统监控 */ public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception ex) throws Exception { System.out.println("afterCompletion..................."); System.out.println("----------------------------------"); ex.printStackTrace(); System.out.println("----------------------------------"); } /** * 执行时机:Controller执行完毕,视图解析器解析之前来执行 * 注意:此案例中如果是测试异步,这里的mv是null,此处会报错。 * 解决办法是注释掉springmvc-servlet.xml中的拦截器的配置内容 */ public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView mv) throws Exception { Map<String, Object> map = mv.getModel(); map.put("test", "append something..."); System.out.println("postHandle..."); } /** * 返回值数据类型是布尔类型:true放行, false是阻止访问 * 执行时机:Controller执行之前 * * 最常用的应用场景就是权限的拦截 */ public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object obj) throws Exception { System.out.println("preHandle..."); System.out.println(obj.getClass().getName()); return true; } } |
8 Person的内容如下:
package com.rl.model; import java.util.Date; publicclass Person { Integer id; String name; Integer age; String address; Date birthday; /** * @return the id */ public Integer getId() { returnid; } /** * @param id the id to set */ publicvoid setId(Integer id) { this.id = id; } /** * @return the name */ public String getName() { returnname; } /** * @param name the name to set */ publicvoid setName(String name) { this.name = name; } /** * @return the age */ public Integer getAge() { returnage; } /** * @param age the age to set */ publicvoid setAge(Integer age) { this.age = age; } /** * @return the address */ public String getAddress() { returnaddress; } /** * @param address the address to set */ publicvoid setAddress(String address) { this.address = address; } /** * @return the birthday */ public Date getBirthday() { returnbirthday; } /** * @param birthday the birthday to set */ publicvoid setBirthday(Date birthday) { this.birthday = birthday; } } |
9 User的内容如下
package com.rl.model; publicclass User { Integer id; String name; /** * @return the id */ public Integer getId() { returnid; } /** * @param id the id to set */ publicvoid setId(Integer id) { this.id = id; } /** * @return the name */ public String getName() { returnname; } /** * @param name the name to set */ publicvoid setName(String name) { this.name = name; } @Override public String toString() { return"User [id=" +id +", name=" +name +"]"; } } |
10 ajax.jsp的内容如下:
<%@page language="java"import="java.util.*"pageEncoding="utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPEHTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <basehref="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title> <metahttp-equiv="pragma"content="no-cache"> <metahttp-equiv="cache-control"content="no-cache"> <metahttp-equiv="expires"content="0"> <metahttp-equiv="keywords"content="keyword1,keyword2,keyword3"> <metahttp-equiv="description"content="This is my page"> <scripttype="text/javascript"src="js/jquery.js"></script> <scripttype="text/javascript"> $(function(){ $("#mybutton").click(function(){ console.log("test"); varmytext = $("#mytext").val(); $.ajax({ url:"test/ajax1.do", type:"post", dataType:"text", data:{ name:mytext }, success:function(responseText){ alert(responseText); }, error:function(){ alert("system error"); } }); }); }); </script> </head> <body> <inputtype="text"id="mytext"/> <inputid="mybutton"type="button"value="click"/> </body> </html> |
11 form.jsp的内容如下:
<%@page language="java"import="java.util.*"pageEncoding="utf-8"%> <!DOCTYPEHTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>My JSP 'form.jsp' starting page</title> </head> <body> <formaction="upload/uploadPic.do"method="post"enctype="multipart/form-data"> id:<inputname="id"type="text"/><br> name:<inputname="name"type="text"/><br> age:<inputname="age"type="text"/><br> address:<inputname="address"type="text"/><br> birthday:<inputname="birthday"type="text"/><br> pic:<inputtype="file"name="pic"/><br> <inputvalue="submit"type="submit"/> </form> </body> </html> |
12 index.jsp的内容如下:
<%@page language="java"import="java.util.*"pageEncoding="utf-8"%> <%@taglib uri="http://java.sun.com/jsp/jstl/fmt"prefix="fmt"%> <!DOCTYPEHTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>My JSP 'index.jsp' starting page</title> </head> <body> <h1>${person.id}</h1> <h1>${person.name}</h1> <h1>${person.age}</h1> <h1>${person.address}</h1> <h1><fmt:formatDatevalue="${person.birthday }"pattern="yyyy-MM-dd"/></h1> <h1>${test }</h1> </body> </html> |
13 success.jsp的内容如下:
<%@page language="java"import="java.util.*"pageEncoding="utf-8"%> <!DOCTYPEHTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>My JSP 'success.jsp' starting page</title> </head> <body> success<br> </body> </html> |
02基于注解开发SpringMVC项目(jar包,异步,request,参数传递,多选的接收,Model传参,map传参,model传参,ajax,重定向,时间日期转换)相关推荐
- 手动创建1个基于注解的springmvc项目
众所周知, SpringMvc有4个基本组件 DispatcherServlet -> 中央调度器, 使用前端设计模式拦截所有的url请求 HandlerMapping -> 分发不同的u ...
- 使用注解开发SpringMVC详细配置教程
目录 1.使用注解开发SpringMVC 1.新建一个普通的maven项目,添加web支持 2.在pom.xml中导入相关依赖 3.配置web.xml 4.编写SpringMVC配置文件 1. 自动扫 ...
- java打包要依赖maven库吗_maven-将依赖的 jar包一起打包到项目 jar 包中
前言: 有时候在项目开发中,需要很多依赖的 jar 包,其中依赖的 jar 包也会依赖其他的 jar 包,导致jar 包的管理很容易不全,以下有两种方法可以规避这个问题. 一.在pom.xml 文件中 ...
- MyBatis-学习笔记04【04.自定义Mybatis框架基于注解开发】
Java后端 学习路线 笔记汇总表[黑马程序员] MyBatis-学习笔记01[01.Mybatis课程介绍及环境搭建][day01] MyBatis-学习笔记02[02.Mybatis入门案例] M ...
- pom 的第三方jar报错_01_maven-将第三方jar包一起打包到项目 jar 包中
前言:maven-将依赖的 jar包一起打包到项目 jar 包中 有时候在项目开发中,需要很多依赖的 jar 包,其中依赖的 jar 包也会依赖其他的 jar 包,导致jar 包的管理很容易不全. 如 ...
- 由提交storm项目jar包引发对jar的原理的探索
序:在开发storm项目时,提交项目jar包当把依赖的第三方jar包都打进去提交storm集群启动时报了发现多个同名的文件错误由此开始了一段对jar包的深刻理解之路. java.lang.Runtim ...
- 【SpringBoot】32、SpringBoot项目Jar包如何瘦身部署
一.背景 SpringBoot 为我们快速开发提供了很好的架子,使得我们只需要少量配置就能开始我们的开发工作,但是当我们需要打包上传部署时,却是很神伤的一个问题,因为打出来的 Jar 包少则十几兆,多 ...
- 使用Nacos项目jar包启动抛出的yml异常
记录一下项目jar包启动时一直抛出nacos yml编译错误的问题 一开始抛出yml的问题,是编码问题,但是又不知道Nacos里怎么配置编码格式. 所以我只能把nacos中配置文件里的注释含泪删除调试 ...
- IDEA引MAVEN项目jar包依赖导入问题解决
IDEA引MAVEN项目jar包依赖导入问题解决 参考文章: (1)IDEA引MAVEN项目jar包依赖导入问题解决 (2)https://www.cnblogs.com/a8457013/p/781 ...
最新文章
- sql server 交叉表查询实例-成绩统计
- Scanf连续调用多次并且存在%c的问题
- C++第10周项目2扩展之2参考——迭代求和
- pat 乙级 1019 数字黑洞(C++)
- crossin的编程教室python入门_简单三步,用 Python 发邮件
- Django(一)预热
- .NET Windows编程系列笔记(一)
- 并查集基础 模板题 hdu1232 畅通工程
- 关于Linux系统启动过程,你应该了解这些
- vscode unins000.exe报错
- 会计如何使用计算机,2020年高级会计师考试如何使用计算器?(图文说明)
- 弘辽科技:抖加投放后会增粉吗?有什么技巧?
- python客户价值分析_Python实现RFM客户价值分析
- c语言乘法除法结合律,C语言运算符的优先级和结合律
- c语言 宏常量 pi,宏和常量
- 重磅:腾讯低代码平台正式开源!可拖拽生成手机、PC等项目!接私活福利啊!...
- windows phone的那些应用们 有意思的,good design的,有用的...
- 毕业两年,工作三年Java程序员的一点点体会与建议
- 期货反向跟单门槛高吗,中小群体个人能不能做
- 报表引擎终于做出来了!!!
热门文章
- 机器学习(2.sklearn(Scikit-learn)库、字典数据的特征抽取)
- 从数据处理到人工智能的一批计算生态
- Chrome 访问一次 Controller,请求却执行两次
- VTK:隐式平面小部件用法实战
- VTK:绘制箱形图 BoxChart用法实战
- JavaScript实现将位转换为浮点数bitsToFloat算法(附完整源码)
- JavaScript实现bellmanFord贝尔曼-福特算法(附完整源码)
- OpenCASCADE:形状愈合之根据指定标准分割形状的工具
- wxWidgets 的打印演示
- wxWidgets:wxDataObject概述