前言

本文主要是讲解在Controller中的开发,主要的知识点有如下:

  • 编码过滤器
  • 使用注解开发
  • 注解@RequestMapping详解
  • 业务方法接收参数
  • 字符串转日期
  • 重定向和转发
  • 返回JSON

SpringMVC过滤编码器

在SpringMVC的控制器中,如果没有对编码进行任何的操作,那么获取到的中文数据是乱码!

即使我们在handle()方法中,使用request对象设置编码也不行!原因也非常简单,我们SpringMVC接收参数是通过控制器中的无参构造方法,再经过handle()方法的object对象来得到具体的参数类型的

Struts2是使用拦截器来自动帮我们完成中文乱码的问题的。那么SpringMVC作为一个更加强大的框架,肯定也有对应的方法来帮我们完成中文乱码问题!

值得注意的是:该过滤编码器只能解决POST的乱码问题

我们只需要在web.xml配置文件中设置过滤编码器就行了


  1. <!-- 编码过滤器 -->
  2. <filter>
  3. <filter-name>CharacterEncodingFilter</filter-name>
  4. <filter-class>
  5. org.springframework.web.filter.CharacterEncodingFilter
  6. </filter-class>
  7. <init-param>
  8. <param-name>encoding</param-name>
  9. <param-value>UTF-8</param-value>
  10. </init-param>
  11. </filter>
  12. <filter-mapping>
  13. <filter-name>CharacterEncodingFilter</filter-name>
  14. <url-pattern>/*</url-pattern>
  15. </filter-mapping>


注解开发SpringMVC

我们在快速入门的例子中使用的是XML配置的方式来使用SpringMVC的,SpringMVC也能够支持注解。【个人非常喜欢注解的方式】

我们在使用Action的时候,要么继承着AbstractCommandController类,要么显示使用注解Controller接口。当我们使用了注解以后就不用显示地继承或实现任何类了

开发流程

使用@Controller这个注解,就表明这是一个SpringMVC的控制器!


  1. @Controller
  2. public class HelloAction {
  3. }

当然了,现在Spring是不知道有这么一个注解的,因此我们需要在配置文件中配置扫描注解

值得注意的是:在配置扫描路径的时候,后面不要加.*

不然扫描不了,我不知道学Struts2还是其他的地方时候,习惯加了.*,于是就搞了很久!

  1. <!--扫描注解,后面不要加.*-->
  2. <context:component-scan base-package="zhongfucheng"/>

在控制器中写业务方法

  1. @Controller
  2. public class HelloAction {
  3. /**
  4. *
  5. * @RequestMapping 表示只要是/hello.action的请求,就交由该方法处理。当然了.action可以去掉
  6. * @param model 它和ModelAndView类似,它这个Model就是把数据封装到request对象中,我们就可以获取出来
  7. * @return 返回跳转的页面【真实路径,就不用配置视图解析器了】
  8. * @throws Exception
  9. */
  10. @RequestMapping(value="/hello.action")
  11. public String hello(Model model) throws Exception{
  12. System.out.println("HelloAction::hello()");
  13. model.addAttribute("message","你好");
  14. return "/index.jsp";
  15. }
  16. }

跳转到index页面,首页得到对应的值。


  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4. <title>$Title$</title>
  5. </head>
  6. <body>
  7. 这是我的首页 <br>
  8. ${message}
  9. </body>
  10. </html>


当然了,基于注解和基于XML来开发SpringMVC,都是通过映射器、适配器和视图解析器的。 只是映射器、适配器略有不同。但是都是可以省略的!


  1. <!-- 基于注解的映射器(可选) -->
  2. <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>
  3. <!-- 基于注解的适配器(可选) -->
  4. <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
  5. <!-- 视图解析器(可选) -->
  6. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"/>

更新:上边的适配器和映射器只是Spring3.1版本之前使用的、3.1版本之后现在一般用以下的两个


  1. 映射器:
  2. org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping
  3. 适配器:
  4. org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter

当然了,这上面两个配置也可以使用<mvc:annotation-driven>>替代注解处理器和适配器的配置。


RequestMapping

@RequestMapping能够控制请求路径和请求方式!

一个控制器写多个业务方法

到目前为止,我们都是一个控制器写一个业务方法,这肯定是不合理的。我们在Struts2中一个Action就对应多个业务方法了。那么我们在SpringMVC中又怎么写呢???

其实我们可以推理出来,@RequestMapping就是用于配置哪个请求对应哪个业务方法的!


  1. public @interface RequestMapping {
  2. String[] value() default {};
  3. RequestMethod[] method() default {};
  4. String[] params() default {};
  5. String[] headers() default {};
  6. }

当我们请求hello.action的时候,处理的业务方法是hello().....当我们请求bye.action的时候,处理的业务方法是bye()


  1. @Controller
  2. public class HelloAction {
  3. /**
  4. *
  5. * @RequestMapping 表示只要是/hello.action的请求,就交由该方法处理。当然了.action可以去掉
  6. * @param model 它和ModelAndView类似,它这个Model就是把数据封装到request对象中,我们就可以获取出来
  7. * @return 返回跳转的页面【真实路径,就不用配置视图解析器了】
  8. * @throws Exception
  9. */
  10. @RequestMapping(value="/hello.action")
  11. public String hello(Model model) throws Exception{
  12. System.out.println("HelloAction::hello()");
  13. model.addAttribute("message","你好");
  14. return "/index.jsp";
  15. }
  16. @RequestMapping(value = "/bye.action")
  17. public String bye(Model model) throws Exception {
  18. model.addAttribute("message","再见");
  19. return "/index.jsp";
  20. }
  21. }

分模块开发

当然了,我们在Struts2常常使用namespace来进行分模块开发,在SpringMVC中我们也可以这样干,并且我们又是使用的是@RequestMapping这个注解!

只要把@RequestMapping这个注解写到类上面去,就代表了分模块。

  1. @Controller
  2. //我们知道,如果是value属性上的注解,我们可以把value省略掉的
  3. @RequestMapping("/zhongfucheng")
  4. public class HelloAction {
  5. /**
  6. * @param model 它和ModelAndView类似,它这个Model就是把数据封装到request对象中,我们就可以获取出来
  7. * @return 返回跳转的页面【真实路径,就不用配置视图解析器了】
  8. * @throws Exception
  9. * @RequestMapping 表示只要是/hello.action的请求,就交由该方法处理。当然了.action可以去掉
  10. */
  11. @RequestMapping(value = "/hello.action")
  12. public String hello(Model model) throws Exception {
  13. System.out.println("HelloAction::hello()");
  14. model.addAttribute("message", "你好");
  15. return "/index.jsp";
  16. }
  17. @RequestMapping(value = "/bye.action")
  18. public String bye(Model model) throws Exception {
  19. model.addAttribute("message", "再见");
  20. return "/index.jsp";
  21. }
  22. }

那么我们想要HelloAction该控制器处理我们的请求,访问的地址要么是:http://localhost:8080/zhongfucheng/hello.action,或者要么是http://localhost:8080/zhongfucheng/bye.action


限定某个业务控制方法,只允许GET或POST请求方式访问

我们如果想要限定某个业务控制方法,只允许GET或POST请求方式访问。还是通过@RequestMapping来实现。只要设定它的method属性就行了


  1. @RequestMapping(value = "/bye.action",method = RequestMethod.POST)
  2. public String bye(Model model) throws Exception {
  3. model.addAttribute("message", "再见");
  4. return "/index.jsp";
  5. }

当我把业务方法的请求设置为POST以后,我想要通过GET方式来访问该业务方法。就行不通了!


业务方法写入传统web参数

我们的业务方法除了可以写Model这个参数以外,如果有需要我们还可以写request,response等传统Servlet的参数。这是一样可以使用的....

但是呢,我们并不建议使用传统的web参数,因为会耦合


  1. @RequestMapping(method=RequestMethod.POST,value="/register")
  2. public String registerMethod(HttpServletRequest request,HttpServletResponse response) throws Exception{
  3. //获取用户名和薪水
  4. String username = request.getParameter("username");
  5. String salary = request.getParameter("salary");
  6. System.out.println("用户注册-->" + username + ":" + salary);
  7. //绑定到session域对象中
  8. request.getSession().setAttribute("username",username);
  9. request.getSession().setAttribute("salary",salary);
  10. //重定向/jsp/success.jsp页面
  11. //response.sendRedirect(request.getContextPath()+"/jsp/success.jsp");
  12. //转发/jsp/ok.jsp页面
  13. request.getRequestDispatcher("/jsp/ok.jsp").forward(request,response);
  14. //转发(提倡)
  15. return "/jsp/success.jsp";
  16. }

小细节:如果我们的返回值是返回一个真实路径,而我们在程序中又使用了转发或重定向。。。那么具体跳转的位置就是按我们程序中跳转的路径为准

业务方法收集参数

我们在Struts2中收集web端带过来的参数是在控制器中定义成员变量,该成员变量的名字与web端带过来的名称是要一致的...并且,给出该成员变量的set方法,那么Struts2的拦截器就会帮我们自动把web端带过来的参数赋值给我们的成员变量....

那么在SpringMVC中是怎么收集参数的呢????我们SpringMVC是不可能跟Struts2一样定义成员变量的,因为SpringMVC是单例的,而Struts2是多例的。因此SpringMVC是这样干的:

  • 业务方法写上参数
  • 参数的名称要和web端带过来的数据名称要一致

接收普通参数

如果是普通参数的话,我们直接在方法上写上与web端带过来名称相同的参数就行了!


  1. <form action="${pageContext.request.contextPath}/hello.action" method="post">
  2. <table align="center">
  3. <tr>
  4. <td>用户名:</td>
  5. <td><input type="text" name="username"></td>
  6. </tr>
  7. <tr>
  8. <td>编号</td>
  9. <td><input type="text" name="id"></td>
  10. </tr>
  11. <tr>
  12. <td colspan="2">
  13. <input type="submit" value="提交">
  14. </td>
  15. </tr>
  16. </table>
  17. </form>

  1. @RequestMapping(value = "/hello.action")
  2. public String hello(Model model, String username, int id) throws Exception {
  3. System.out.println("用户名是:" + username);
  4. System.out.println("编号是:" + id);
  5. model.addAttribute("message", "你好");
  6. return "/index.jsp";
  7. }

效果:


接收JavaBean

我们处理表单的参数,如果表单带过来的数据较多,我们都是用JavaBean对其进行封装的。那么我们在SpringMVC也是可以这么做的。

  • 创建Javabean
  • javaBean属性与表单带过来的名称相同
  • 在业务方法上写上Javabean的名称

创建JavaBean,javaBean属性与表单带过来的名称相同


  1. public class User {
  2. private String id;
  3. private String username;
  4. public User() {
  5. }
  6. public User(String id, String username) {
  7. this.id = id;
  8. this.username = username;
  9. }
  10. public String getId() {
  11. return id;
  12. }
  13. public void setId(String id) {
  14. this.id = id;
  15. }
  16. public String getUsername() {
  17. return username;
  18. }
  19. public void setUsername(String username) {
  20. this.username = username;
  21. }
  22. @Override
  23. public String toString() {
  24. return "User{" +
  25. "id='" + id + '\'' +
  26. ", username='" + username + '\'' +
  27. '}';
  28. }
  29. }

在业务方法参数上写入Javabean


  1. @RequestMapping(value = "/hello.action")
  2. public String hello(Model model,User user) throws Exception {
  3. System.out.println(user);
  4. model.addAttribute("message", "你好");
  5. return "/index.jsp";
  6. }


收集数组

收集数组和收集普通的参数是类似的,看了以下的代码就懂了。


  1. <form action="${pageContext.request.contextPath}/hello.action" method="post">
  2. <table align="center">
  3. <tr>
  4. <td>用户名:</td>
  5. <td><input type="text" name="username"></td>
  6. </tr>
  7. <tr>
  8. <td>爱好</td>
  9. <td><input type="checkbox" name="hobby" value="1">篮球</td>
  10. <td><input type="checkbox" name="hobby" value="2">足球</td>
  11. <td><input type="checkbox" name="hobby" value="3">排球</td>
  12. <td><input type="checkbox" name="hobby" value="4">羽毛球</td>
  13. </tr>
  14. <tr>
  15. <td colspan="2">
  16. <input type="submit" value="提交">
  17. </td>
  18. </tr>
  19. </table>
  20. </form>

业务方法获取参数


  1. @RequestMapping(value = "/hello.action")
  2. public String hello(Model model,int[] hobby) throws Exception {
  3. for (int i : hobby) {
  4. System.out.println("喜欢运动的编号是:" + i);
  5. }
  6. model.addAttribute("message", "你好");
  7. return "/index.jsp";
  8. }

效果:

收集List<JavaBean>集合

我们在Spring的业务方法中是不可以用List这样的参数来接收的,SpringMVC给了我们另一种方案!

我们使用一个JavaBean把集合封装起来,给出对应的set和get方法。那么我们在接收参数的时候,接收的是JavaBean


  1. /**
  2. * 封装多个Emp的对象
  3. * @author AdminTC
  4. */
  5. public class Bean {
  6. private List<Emp> empList = new ArrayList<Emp>();
  7. public Bean(){}
  8. public List<Emp> getEmpList() {
  9. return empList;
  10. }
  11. public void setEmpList(List<Emp> empList) {
  12. this.empList = empList;
  13. }
  14. }

业务方法接收JavaBean对象


  1. /**
  2. * 批量添加员工
  3. */
  4. @RequestMapping(value="/addAll",method=RequestMethod.POST)
  5. public String addAll(Model model,Bean bean) throws Exception{
  6. for(Emp emp:bean.getEmpList()){
  7. System.out.println(emp.getUsername()+":"+emp.getSalary());
  8. }
  9. model.addAttribute("message","批量增加员工成功");
  10. return "/jsp/ok.jsp";
  11. }

在JSP页面直接写上empList[下表].


  1. <form action="${pageContext.request.contextPath}/emp/addAll.action" method="POST">
  2. <table border="2" align="center">
  3. <caption><h2>批量注册员工</h2></caption>
  4. <tr>
  5. <td><input type="text" name="empList[0].username" value="哈哈"/></td>
  6. <td><input type="text" name="empList[0].salary" value="7000"/></td>
  7. </tr>
  8. <tr>
  9. <td><input type="text" name="empList[1].username" value="呵呵"/></td>
  10. <td><input type="text" name="empList[1].salary" value="7500"/></td>
  11. </tr>
  12. <tr>
  13. <td><input type="text" name="empList[2].username" value="班长"/></td>
  14. <td><input type="text" name="empList[2].salary" value="8000"/></td>
  15. </tr>
  16. <tr>
  17. <td><input type="text" name="empList[3].username" value="键状哥"/></td>
  18. <td><input type="text" name="empList[3].salary" value="8000"/></td>
  19. </tr>
  20. <tr>
  21. <td><input type="text" name="empList[4].username" value="绿同学"/></td>
  22. <td><input type="text" name="empList[4].salary" value="9000"/></td>
  23. </tr>
  24. <tr>
  25. <td colspan="2" align="center">
  26. <input type="submit" value="批量注册"/>
  27. </td>
  28. </tr>
  29. </table>
  30. </form>

其实这种方法看起来也没有那么难理解,我们就是向上封装了一层【与接收普通的JavaBean类似的】


收集多个模型

我们有可能在JSP页面上即有User模型的数据要收集,又有Emp模型的数据要收集....并且User模型的属性和Emp模型的属性一模一样....此时我们该怎么办呢???

我们也是可以在User模型和Emp模型上向上抽象出一个Bean,该Bean有Emp和User对象

  1. /**
  2. * 封装User和Admin的对象
  3. * @author AdminTC
  4. */
  5. public class Bean {
  6. private User user;
  7. private Admin admin;
  8. public Bean(){}
  9. public User getUser() {
  10. return user;
  11. }
  12. public void setUser(User user) {
  13. this.user = user;
  14. }
  15. public Admin getAdmin() {
  16. return admin;
  17. }
  18. public void setAdmin(Admin admin) {
  19. this.admin = admin;
  20. }
  21. }

在JSP页面收集的时候,给出对应的类型就行了。


  1. <form action="${pageContext.request.contextPath}/person/register.action" method="POST">
  2. <table border="2" align="center">
  3. <tr>
  4. <th>姓名</th>
  5. <td><input type="text" name="user.username" value="${user.username}"/></td>
  6. </tr>
  7. <tr>
  8. <th>月薪</th>
  9. <td><input type="text" name="user.salary" value="${user.salary}"></td>
  10. </tr>
  11. <tr>
  12. <th>入职时间</th>
  13. <td><input
  14. type="text"
  15. name="user.hiredate"
  16. value='<fmt:formatDate value="${user.hiredate}" type="date" dateStyle="default"/>'/></td>
  17. </tr>
  18. <tr>
  19. <td colspan="2" align="center">
  20. <input type="submit" value="普通用户注册" style="width:111px"/>
  21. </td>
  22. </tr>
  23. </table>
  24. </form>

字符串转日期类型

我们在Struts2中,如果web端传过来的字符串类型是yyyy-mm-dd hh:MM:ss这种类型的话,那么Struts2默认是可以自动解析成日期的,如果是别的字符串类型的话,Struts2是不能自动解析的。要么使用自定义转换器来解析,要么就自己使用Java程序来解析....

而在SpringMVC中,即使是yyyy-mm-dd hh:MM:ss这种类型SpringMVC也是不能自动帮我们解析的。我们看如下的例子:

JSP传递关于日期格式的字符串给控制器...

  1. <form action="${pageContext.request.contextPath}/hello.action" method="post">
  2. <table align="center">
  3. <tr>
  4. <td>用户名:</td>
  5. <td><input type="text" name="username"></td>
  6. </tr>
  7. <tr>
  8. <td>出生日期</td>
  9. <td><input type="text" name="date" value="1996-05-24"></td>
  10. </tr>
  11. <tr>
  12. <td colspan="2">
  13. <input type="submit" value="提交">
  14. </td>
  15. </tr>
  16. </table>
  17. </form>

User对象定义Date成员变量接收


  1. public Date getDate() {
  2. return date;
  3. }
  4. public void setDate(Date date) {
  5. this.date = date;
  6. }

业务方法获取Date值


  1. @RequestMapping(value = "/hello.action")
  2. public String hello(Model model, User user) throws Exception {
  3. System.out.println(user.getUsername() + "的出生日期是:" + user.getDate());
  4. model.addAttribute("message", "你好");
  5. return "/index.jsp";
  6. }

结果出问题了,SpringMVC不支持这种类型的参数:


现在问题就抛出来了,那我们要怎么解决呢????

SpringMVC给出类似于Struts2类型转换器这么一个方法给我们使用:如果我们使用的是继承AbstractCommandController类来进行开发的话,我们就可以重写initBinder()方法了....

具体的实现是这样子的:


  1. @Override
  2. protected void initBinder(HttpServletRequest request,ServletRequestDataBinder binder) throws Exception {
  3. binder.registerCustomEditor(Date.class,new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"),true));
  4. }

那我们现在用的是注解的方式来进行开发,是没有重写方法的。因此我们需要用到的是一个注解,表明我要重写该方法


  1. @InitBinder
  2. protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception {
  3. binder.registerCustomEditor(
  4. Date.class,
  5. new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));
  6. }

再次访问:

值得注意的是:如果我们使用的是Oracle插入时间的话,那么我们在SQL语句就要写TimeStrap时间戳插入进去,否则就行不通


结果重定向和转发

我们一般做开发的时候,经常编辑完数据就返回到显示列表中。我们在Struts2是使用配置文件进行重定向或转发的:

而我们的SpringMVC就非常简单了,只要在跳转前写上关键字就行了!

  1. public String hello(Model model, User user) throws Exception {
  2. System.out.println(user.getUsername() + "的出生日期是:" + user.getDate());
  3. model.addAttribute("message", user.getDate());
  4. return "redirect:/index.jsp";
  5. }

以此类推,如果是想要再次请求的话,那么我们只要写上对应的请求路径就行了!


  1. @RequestMapping(value = "/hello.action")
  2. public String hello(Model model, User user) throws Exception {
  3. return "redirect:/bye.action";
  4. }
  5. @RequestMapping("/bye.action")
  6. public String bye() throws Exception {
  7. System.out.println("我进来了bye方法");
  8. return "/index.jsp";
  9. }


返回JSON文本

回顾一下Struts2返回JSON文本是怎么操作的:

  • 导入jar包
  • 要返回JSON文本的对象给出get方法
  • 在配置文件中继承json-default包
  • result标签的返回值类型是json

那么我们在SpringMVC又怎么操作呢???

导入两个JSON开发包

  • jackson-core-asl-1.9.11.jar
  • jackson-mapper-asl-1.9.11.jar

在要返回JSON的业务方法上给上注解:


  1. @RequestMapping(value = "/hello.action")
  2. public
  3. @ResponseBody
  4. User hello() throws Exception {
  5. User user = new User("1", "zhongfucheng");
  6. return user;
  7. }

配置JSON适配器

  1. <!--
  2. 1)导入jackson-core-asl-1.9.11.jar和jackson-mapper-asl-1.9.11.jar
  3. 2)在业务方法的返回值和权限之间使用@ResponseBody注解表示返回值对象需要转成JSON文本
  4. 3)在spring.xml配置文件中编写如下代码:
  5. -->
  6. <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
  7. <property name="messageConverters">
  8. <list>
  9. <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>
  10. </list>
  11. </property>
  12. </bean>

测试的JSP


  1. <input type="button" value="Emp转JSON"/><p>
  2. <input type="button" value="List<Emp>转JSON"/><p>
  3. <input type="button" value="Map<String,Object>转JSON"/><p>
  4. <!-- Map<String,Object>转JSON -->
  5. <script type="text/javascript">
  6. $(":button:first").click(function(){
  7. var url = "${pageContext.request.contextPath}/hello.action";
  8. var sendData = null;
  9. $.post(url,sendData,function(backData,textStaut,ajax){
  10. alert(ajax.responseText);
  11. });
  12. });
  13. </script>

测试:

Map测试:


  1. @RequestMapping(value = "/hello.action")
  2. public
  3. @ResponseBody
  4. Map hello() throws Exception {
  5. Map map = new HashMap();
  6. User user = new User("1", "zhongfucheng");
  7. User user2 = new User("12", "zhongfucheng2");
  8. map.put("total", user);
  9. map.put("rows", user2);
  10. return map;
  11. }

更新------------------------------------------------------------------

如果传递进来的数据就是JSON格式的话,我们我们需要使用到另外一个注解@RequestBody,将请求的json数据转成java对象


总结

  • 使用注解的开发避免了继承多余的类,并且非常简洁高效。
  • 想要中文不乱码,仅仅设置request的编码格式是不行的。因为SpringMVC是通过无参的构造器将数据进行封装的。我们可以使用SpringMVC提供的过滤器来解决中文乱码问题。
  • RequestMapping可以设置我们具体的访问路径,还可以分模块开发。基于这么两个原因,我们就可以在一个Action中写多个业务方法了。
  • RequestMapping还能够限制该请求方法是GET还是POST。
  • 在我们的业务方法中,还可以使用传统的request和response等对象,只不过如果不是非要使用的话,最好就别使用了。
  • 对于SpringMVC自己帮我们封装参数,也是需要使用与request带过来的名称是相同的。如果不相同的话,我们需要使用注解来帮我们解决的。
  • 如果是需要封装成集合,或者封装多个Bean的话,那么我们后台的JavaBean就需要再向上一层封装,在业务方法上写上Bean进行了。当然了,在web页面上要指定对应Bean属性的属性
  • 字符串转日期对象用到 @InitBinder注解来重写方法。
  • 返回JSON对象,我们就需要用到@ResponseBody注解,如果接收JSON数据封装成JavaBean的话,我们就需要用到@RequestBody注解。随后在配置文件上创建对应的bean即可。

如果文章有错的地方欢迎指正,大家互相交流。习惯在微信看技术文章,想要获取更多的Java资源的同学,可以关注微信公众号:Java3y

SpringMVC【开发Controller】详解的更多相关文章

  1. SpringMVC框架02——SpringMVC的Controller详解

    1.基于注解的控制器 1.1.@Controller 注解类型 在SpringMVC中使用org.springframework.stereotype.Controller注解类型声明某类的实例是一个 ...

  2. Extjs MVC开发模式详解

    Extjs MVC开发模式详解   在JS的开发过程中,大规模的JS脚本难以组织和维护,这一直是困扰前端开发人员的头等问题.Extjs为了解决这种问题,在Extjs 4.x版本中引入了MVC开发模式, ...

  3. ext.js的mvc开发模式详解

    ext.js的mvc开发模式详解和环境配置 在JS的开发过程中,大规模的JS脚本难以组织和维护,这一直是困扰前端开发人员的头等问题.Extjs为了解决这种问题,在Extjs 4.x版本中引入了MVC开 ...

  4. SpringMVC 常用注解 详解

    SpringMVC 常用注解 详解 SpringMVC 常用注解 1.@RequestMapping                                      路径映射 2.@Requ ...

  5. Asp.Net MVC part2 View、Controller详解

    View详解Razor视图引擎简介HtmlHelper强类型页面 Razor视图引擎简介强大的@:表示使用C#代码,相当于aspx中的<%%>可以完成输出功能当遇到html标签时会认为C# ...

  6. 《Android NFC 开发实战详解 》简介+源码+样章+勘误ING

    <Android NFC 开发实战详解>简介+源码+样章+勘误ING SkySeraph Mar. 14th  2014 Email:skyseraph00@163.com 更多精彩请直接 ...

  7. C++的性能C#的产能?! - .Net Native 系列《二》:.NET Native开发流程详解

    之前一文<c++的性能, c#的产能?!鱼和熊掌可以兼得,.NET NATIVE初窥> 获得很多朋友支持和鼓励,也更让我坚定做这项技术的推广者,希望能让更多的朋友了解这项技术,于是先从官方 ...

  8. Cocos2d-x 3.X手游开发实例详解

    Cocos2d-x 3.X手游开发实例详解(最新最简Cocos2d-x手机游戏开发学习方法,以热门游戏2048.卡牌为例,完整再现手游的开发过程,实例丰富,代码完备,Cocos2d-x作者之一林顺和泰 ...

  9. 《Node.js开发实战详解》学习笔记

    <Node.js开发实战详解>学习笔记 ——持续更新中 一.NodeJS设计模式 1 . 单例模式 顾名思义,单例就是保证一个类只有一个实例,实现的方法是,先判断实例是否存在,如果存在则直 ...

  10. 免费的HTML5连载来了《HTML5网页开发实例详解》连载(二)

    最近新浪.百度.腾讯.京东.大众点评.淘宝等流行的网站都加大了招聘HTML5的力度,HTML5开发人员成了抢手货,本次连载的是由大众点评前端工程师和一淘网前端工程师基情奉献的<HTML5网页开发 ...

随机推荐

  1. Python自动化--语言基础2--运算符、格式化输出、条件语句、循环语句、列表、元组

    运算符包括:算术运算符.比较运算符.赋值运算符.逻辑运算符.成员运算符.身份运算符 算术运算符 %   取模(余数) //  取相除的整数部分 /   (5/2=2.5) 比较运算符 ==  等于 ! ...

  2. thinkphp5判断移动或pc端访问并调用不同模板

    废话不多说,直接上代码 先修改\thinkphp\library\think\view\driver\Think.php文件 把 public function __construct($config ...

  3. 删除表中的所有记录 ID从1开始

    TRUNCATE TABLE 删除表中的所有行,而不记录单个行删除操作.语法TRUNCATE TABLE nameTRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相 ...

  4. C语言队列(数组内核)

    #include <stdio.h>#include <stdbool.h>#include <stdlib.h>struct Queue{ int *pBase; ...

  5. 1.12 dict 字典表

    dict 字典表属于映射分类 dict的声明 >>> #dict类型 是 {}中包含若干个键值对 >>> d = dict() >>> d = { ...

  6. hdu1394 分治 or 线段树

    利用分治求一次逆序数,然后每次把第一个元素放到末尾,设该交换元素的值为x,设上一次求得的逆序数为y,那么此时的逆序数等于y - x + (n - x - 1),减去x是因为x作为第一个元素,其后共有x ...

  7. java 集合类Array、List、Map区别和优缺点

    Java集合类主要分为以下三类: 第一类:Array.Arrays 第二类:Collection :List.Set第三类:Map :HashMap.HashTable 一.Array , Array ...

  8. JVM笔记1-内存溢出分析问题与解决

    假设我们项目中JVM内存溢出了,大项目中上百万行代码,是很难定位的.因此我们需要借用一个Memory Analyzer工具, 官网地址为:http://www.eclipse.org/download ...

  9. Nginx 开启gzip压缩(图片,文件,css)

    1.Vim打开Nginx配置文件 vim /usr/local/nginx/conf/nginx.conf 2.找到如下一段,进行修改 gzip on; gzip_min_length 1k; gzi ...

  10. FFMpeg.H264解码win开发环境搭建

    开发环境: vc6.0 + sp5 + vcpp5,注意vcpp5在vc6+sp6上会安装失败. 源码: ff_264_dec_vc,可用vc进行编译调试,但编译环境限定如上. 声明:该工程是ffmp ...