一、Spring简介

Spring MVC是当前最优秀的 MVC 框架,自从Spring 2.5 版本发布后,由于支持注解配置,易用性有了大幅度的提高。Spring 3.0 更加完善,实现了对 Struts 2 的超越。现在越来越多的开发团队选择了Spring MVC。

1)Spring3 MVC使用简单,学习成本低。学习难度小于Struts2,Struts2用不上的多余功能太多

2)Spring3 MVC很容易就可以写出性能优秀的程序,Struts2要处处小心才可以写出性能优秀的程序(指MVC部分)

3)灵活

√让我们能非常简单的设计出干净的Web层和薄薄的Web层;

√进行更简洁的Web层的开发;

√天生与Spring框架集成(如IoC容器、AOP等);

√提供强大的约定大于配置的契约式编程支持;

√能简单的进行Web层的单元测试;

√支持灵活的URL到页面控制器的映射;

√非常容易与其他视图技术集成,如Velocity、FreeMarker等等,因为模型数据不放在特定的API里,而是放在一个Model里(Map数据结构实现,因此很容易被其他框架使用);

√非常灵活的数据验证、格式化和数据绑定机制,能使用任何对象进行数据绑定,不必实现特定框架的API;

√提供一套强大的JSP标签库,简化JSP开发;

√支持灵活的本地化、主题等解析;

√更加简单的异常处理;

√对静态资源的支持;

√支持Restful风格

前端控制器是DispatcherServlet;

应用控制器其实拆为处理器映射器(Handler Mapping)进行处理器管理和视图解析器(View Resolver)进行视图管理;

页面控制器/动作/处理器为Controller接口(仅包含ModelAndView handleRequest(request, response) 方法)的实现(也可以是任何的POJO类);

支持本地化(Locale)解析、主题(Theme)解析及文件上传等;提供了非常灵活的数据验证、格式化和数据绑定机制;

提供了强大的约定大于配置(惯例优先原则)的契约式编程支持。

二、配置核心控制器

1) 导包,配置环境

aopalliance-1.0.jar

bean-validator.jar

commons-fileupload-1.2.2.jar

commons-io-2.1.jar

commons-logging-1.2.jar

javax.servlet.jsp.jstl-1.2.1.jar

jsp-api-2.1.jar

jstl-1.2.jar

jstl-api-1.2.jar

mysql-connector-java-5.1.7-bin.jar

servlet-api-2.5.jar

spring-aop-4.1.4.RELEASE.jar

spring-beans-4.1.4.RELEASE.jar

spring-context-4.1.4.RELEASE.jar

spring-core-4.1.4.RELEASE.jar

spring-expression-4.1.4.RELEASE.jar

spring-web-4.1.4.RELEASE.jar

spring-webmvc-4.1.4.RELEASE.jar

standard-1.1.2.jar

2)

配置核心控制器

配置处理器映射器 handler Mapping

配置处理器适配器 handler Adapter

配置视图解析器

2.1 配置核心控制器

在 web.xml 中

<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- 在 spring-webmvc-4.1.4.RELEASE.jar 下 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value> //手动指定配置文件的路径
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern> // 可以写成*.do,*.action,但不能写成杠*
</servlet-mapping>

说明:

1 默认情况下,加载配置文件是 WEB-INF/servlet名称-servlet.xml   //springMVC-servlet.xml

2 如果想指定配置文件的路径,可以加入参数进行指写

三、配置

配置处理器映射器, 配置处理器适配器,  配置视图解析器 (即配置主文件)

<!--  配置处理器映射器 handler Mapping -->
<bean name="/search_all" class="cat.controller.UserAction" />
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" /> <!-- 配置处理器适配器 handler Adapter -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" /> <!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" />
//Action 中的方法
public class UserAction implements Controller { //要实现 Controller
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) throws Exception {
UserDao dao=new UserDao();
List<UserInfo> userList=dao.getAllUser(); ModelAndView mv=new ModelAndView();
mv.addObject("userList", userList); //相当于request.setAttribute();
mv.setViewName("user_manage.jsp"); return mv;
}
}

访问的时候 http://localhost:8080/springmvc/search_all

附: user_manage.jsp

<body>
<c:forEach var="u" items="${userList }">
${u.id } | ${u.userName } | ${u.password } <br />
</c:forEach>
</body>

# Default implementation classes for DispatcherServlet s strategy interfaces.
# Used as fallback when no matching beans are found in the DispatcherServlet context.
# Not meant to be customized by application developers.

org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver
org.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver

org.springframework.web.servlet.HandlerMapping=  //处理器映射器
org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,
org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping //这个是3.1之前的
//org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping 应该用这个才对

org.springframework.web.servlet.HandlerAdapter=  //处理器适配器

org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter  //这个是3.1之前的
//org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter 应该用这个才对

org.springframework.web.servlet.HandlerExceptionResolver=
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver,\
org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,\
org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver

org.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator

org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver

org.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager

使用注解的方式配置处理器映射器和处理器适配器

1) 配置文件 springmvc-servlet.xml

//开启扫描
<context:component-scan base-package="cat.controller" /> //开启注解配置
<mvc:annotation-driven /> /* 有了上面的配置,下面的就可以不写了
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" />
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" />
*/ <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
//<property name="prefix" value="/WEB-INF/jsp/" />
<property name="prefix" value="/" />
<property name="suffix" value=".jsp" />
</bean>

2)

@Controller  //这里只能用 @Controller ,不能用 Service
public class UserAction {
@RequestMapping("/search_all") //请求的名称,最好和方法名相同
public ModelAndView getAllUser(){
UserDao dao=new UserDao();
List<UserInfo> userList=dao.getAllUser(); ModelAndView mv=new ModelAndView();
mv.addObject("userList", userList); //相当于request.setAttribute();
mv.setViewName("user_manage.jsp"); return mv;
}
}

五、@RequestMapping 注解, 和 Action中方法的返回值

在上例中添加用主修改的功能

1) @RequestMappingr 的说明

@RequestMapping 用来将url 和方法名进行 映射 ,一个方法,对应一个url , 比如     @RequestMapping("/search_all") 后面可以加.action

可以用类,或方法上,用在类上,表示所有方法的根路径

比如

@RequestMapping("/user")  //写在类体上
public class UserAction { ... }

RequestMappingr 注解有6个属性 value,method,consumes,produces,params,headers

--value 指定请求的实际地址 -> @RequestMapping(value="/search_all")=@RequestMapping("/search_all")

--method 指定请求的method类型 (GET,POST,PUT,DELETE等)

例如

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

说明 如果请求类型不对则出现类似异常 Request method 'GET' not supported

-- consumes:  指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;

-- produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回

-- params: 指定request中必须包含某些参数值时,才让该方法处理。 //实测发现如果指定了,不传将出错

-- headers:指定request中必须包含某些指定的header值,才能让该方法处理请求。

2) Action中方法的返回值的说明

-- ModelAndView

-- String //如果返回的是String 类型,则代表返回的逻辑视图名称 (相当于struts2中的逻辑视图 )

//例一
@RequestMapping(value="/updateUser" ,method=RequestMethod.GET)
public String updateUser(Model model){ //用model 进行传参
UserInfo user=new UserDao().getAdminById(4);
model.addAttribute("user", user);
return "user_edit";
}
//例二 关于请求的转发和重定向
@RequestMapping(value="/updateUser" ,method=RequestMethod.POST) //只有请求是get请求的时候才有效
public String updateUserSubmit(){
System.out.println("-----");
//return "redirce:search_all" ; //重定向 search_all是一个请求的名称
return "forward:search_all" ;
}

-- void

//例子
@RequestMapping(value="/udpateUserSubmit")
public void udpateUserSubmit(HttpServletRequest request,HttpServletResponse response) throws IOException, ServletException{
/* response.sendRedirect("search_all"); //重定向到某个url
response.sendRedirect("success"); //404
request.getRequestDispatcher("/success.jsp").forward(request, response);*/
response.getWriter().print("<h1>哈哈哈,这样也可以</h1>");
response.getWriter().print( "\"userName\":\"张三\",\"password\":\"123\"" ); //返回json数据
}

六、参数绑定与值的传递

页面请求发起的时候,如何把值传给Controller (//Action ),以及如何把模型数据进行传递

1) 在 Controller 的形参上,可以直接定使用以下对象

HttpServletRequest

HttpServletResponse

HttpSession

Model //public abstract interface org.springframework.ui.Model

MdelMap // org.springframework.ui.ModelMap

Map<String ,Object>  //普通的map也可以,往这里放的值,最终就放在了作用域中,在页面就可以取出 ${key} ;

2) 可以使用简单类型

//例一
@RequestMapping("/testParam")
public void testParam(String userName,String password,String note){
System.out.println(userName+":"+password+":"+note);
}
//本例的前提 参数名和请求传上来的参数名要一致
//例二  @RequestParam 注解的作用
@RequestMapping("/testParam2")
public String testParam2(
String userName,
ModelMap mode,
@RequestParam("password") String pwd,
@RequestParam(value="age",required=true) int age, //标明是必须的,如果不传将出错
@RequestParam(value="school",defaultValue="农业工程学院") String school)
{
System.out.println("userName:"+userName);
System.out.println("age:"+age);
System.out.println("school:"+school);
return "success";
}

3) 关于pojo类型(就是bean)

只要表单元素的名字和方法的参数中的属性值相同却可。

@RequestMapping(value="/updateUser",method=RequestMethod.POST)
public String udpateUserSubmit(UserInfo user) {
System.out.println(user); //这里接收的参数是pojo类型
new UserDao().updateUser(user);
return "success";
}
//user_edit.jsp
<form action="${pageContext.request.contextPath }/updateUser" method="post"> //注意,提交方式是post
id: <input type="text" name="id" value="${user.id }" />
账号: <input type="text" name="userName" value="${user.userName }" />
密码: <input type="text" name="password" value="${user.password }" />
备注: <input type="text" name="note" value="${user.note }" />
<input type=submit value="提交" />
</form>

附:

处理乱码spring的过滤器

<filter>
<filter-name>CharacterEncodingFilter</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>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>杠*</url-pattern>
</filter-mapping>

如果是get请求的乱码怎么处理?

public String test(HttpServletRequest request){
String userName=request.getParameter("userName");
userName=new String(userName.getBytes("iso8859-1"),"utf-8");
}
//上例或 在tomcat 的配置文件中(server.xml中加入  useBodyEncodingForURI=ture )
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="utf-8" useBodyEncodingForURI=ture
/>

4) 关于日期类型

例: 在实体类中添加一个日期类型的字段

private Date birthday;   //生成get set
//在user_edit.jsp 页面上 加上字段   
<input type="text" name="birthday" value="${user.birthday }" />  可以发现,在提交的时候出

解决日期类型的问题有以下几个方式

方式一:在实体类中加格式化注解

@DateTimeFormat(pattern="yyyy-MM-dd")  //有效,简单
private Date birthday;

方式二:在控制器中加入一段数据绑定代码

@InitBinder
public void initBinder(WebDataBinder binder) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
dateFormat.setLenient(false);
binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true)); //true:允许输入空值,false:不能为空值
} //此方式:对于某个Oontroller可以独立控制

方式三:要向处理器适配器中注入自定义参数绑定组件

5) 包装类型的pojo

public class UserInfoCustom {
private UserInfo user; //包装一个pojo类型
private String schoolName; //get set 方法..
}

user_add.jsp //用户添加页面

  <form action="${pageContext.request.contextPath }/addUser" method="post">
账号: <input type="text" name="user.userName" />
密码: <input type="text" name="user.password" />
备注: <input type="text" name="user.note" />
学校: <input type="text" name="schoolName" /> //注意
<input type=submit value="提交" />
</form> //添加会员,用包装类型的pojo传值
@RequestMapping(value="/addUser",method=RequestMethod.POST)
public String addUser(UserInfoCustom info){
System.out.println(info);
//new UserDao().addUser(info)
return "success";
}

6) 数组类型的绑定

user_manage.jsp

<form action="${pageContext.request.contextPath }/deleUser" method="post">
<c:forEach var="u" items="${userList }">
<input type="checkbox" name="ids" value="${u.id } "> ${u.id } | ${u.userName } | ${u.password } <br />
</c:forEach>
<input type="submit" value="删除所选" >
</form>

控制层中业务方法

@RequestMapping("/deleUser")
public String delUsers(Integer [] ids){ //参数名要和页面中传的参数名相同
for(Integer id:ids){
System.out.println(id);
}
//new UserDao().deleteUsers(ids);
return "success";
} //附:也可以如下
@RequestMapping("/deleUser")
public String delUsers(HttpServletRequest request){
String [] ids=request.getParameterValues("ids");
//new UserDao().deleteUsers(ids);
return "success";
}

7) List 类型的数据绑定 (比如批量更新)

包装类型

public class UserInfoCustomL {
private List<UserInfo> userList; //生成get set
}           

Java框架之Spring MVC(一)的更多相关文章

  1. Java框架之Spring MVC(二)

    一.Spring MVC 验证 JSR 303 是ajvaEE6 中的一项子规范 ,叫 Bean Validation 用于对javaBean中的字段进行校验. 官方的参考实现是: Hibernate ...

  2. java企业架构 spring mvc +mybatis + KafKa+Flume+Zookeeper

    声明:该框架面向企业,是大型互联网分布式企业架构,后期会介绍linux上部署高可用集群项目. 项目基础功能截图(自提供了最小部分)      平台简介        Jeesz是一个分布式的框架,提供 ...

  3. 第63节:Java中的Spring MVC简介笔记

    前言 感谢! 承蒙关照~ Java中的Spring MVC简介笔记 MVC简介 Spring MVC 基本概念 Spring MVC 项目搭建 maven 使用Spring MVC进行开发 实现数据绑 ...

  4. Java方式配置Spring MVC

    概述 使用Java方式配置Spring MVC,以及回顾一下Spring MVC的各种用法. Spring MVC简述 关于Spring MVC的介绍网上有很多,这里就不再赘述了,只是要说一下,Spr ...

  5. 【Java】关于Spring MVC框架的总结

    SpringMVC是一种基于Java,实现了Web MVC设计模式,请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将Web层进行职责解耦.基于请求驱动指的就是使用请求-响应模型,框架的 ...

  6. 如何用Java类配置Spring MVC(不通过web.xml和XML方式)

    DispatcherServlet是Spring MVC的核心,按照传统方式, 需要把它配置到web.xml中. 我个人比较不喜欢XML配置方式, XML看起来太累, 冗长繁琐. 还好借助于Servl ...

  7. [Java] Maven 建立 Spring MVC 工程

    GIT: https://github.com/yangyxd/Maven.SpringMVC.Web 1. 建立 WebApp 工程 下一步: 下一步: 选择 maven-archetype-web ...

  8. java框架篇---spring AOP 实现原理

    什么是AOP AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善.OOP引入 ...

  9. java框架之Spring(2)-注解配置IOC&AOP配置

    注解配置IoC 准备 1.要使用注解方式配置 IoC,除了之前引入的基础 jar 包,还需要引入 spring-aop 支持包,如下: 2.在 applicationContext.xml 中引入 c ...

随机推荐

  1. 使用邮件激活授权/ LightningChart license

    在无网络连接的情况下,可以采用邮件的方式激活授权. 先打开License Manager,然后选 Activate/Deactivate via email, 如下图所示: 此邮件将自动发送到 lic ...

  2. Android开发之漫漫长途 Ⅷ——Android Binder(也许是最容易理解的)

    该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...

  3. 基于winpcap的以太网流量分析器(java)

    开发工具 IDE:eclipse -neon JDK:1.8 OS:Win10-64bit 主要功能 1.要求完成一个基于Winpcap的网络流量统计分析系统,具有易用.美观的界面. 2.完成局域网( ...

  4. HDU 4193 Non-negative Partial Sums(想法题,单调队列)

    HDU 4193 题意:给n个数字组成的序列(n <= 10^6).求该序列的循环同构序列中,有多少个序列的随意前i项和均大于或等于0. 思路: 这题看到数据规模认为仅仅能用最多O(nlogn) ...

  5. string的内存管理问题

    string的内存管理是通过仅仅增不减的方式进行的,string的clear方法不会真正的释放内存,假设须要真正的释放内存可以连续调用string的这两个方法.resize(0),reserve(). ...

  6. TCP传输中序号与确认序号的交互

    本实验通过SSH远程登录server,然后使用Wireshark抓包分析. 开头的三次握手已经省略.关于序号的交互过程.须要记住一点:TCP首部中的确认序号表示已成功收到字节,但还不包括确认序号所指的 ...

  7. AspNet Core Api Restful +Swagger 实现微服务之旅(四)

    这几天没更新,项目框架也是在发展阶段,这几天学习配置了一遍Apollo和RabbitMQ 等到放到框架上之后我整理一下到时候把心得写出来相互学习. 接着上一篇的内容 (2)  程序错误时  返回数据格 ...

  8. Linux基础:文件查找find

    写在前面 在linux的日常管理中,find的使用频率很高,熟练掌握对提高工作效率很有帮助. find的语法比较简单,常用参数的就那么几个,比如-name.-type.-ctime等.初学的同学直接看 ...

  9. 获取本地ip

    public void GetLocalIP(string username) { List<string> strIPs = new List<string>(); Netw ...

  10. 【功能代码】---5 JS通过事件隐藏显示元素

    JS通过事件隐藏显示元素 在开发中,很多时候我们需要点击事件,才显示隐藏元素.那如何做到页面刚开始就把标签隐藏. 有两种方法: (1) display:none    <div id=" ...