Java框架之Spring MVC(一)
一、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(一)的更多相关文章
- Java框架之Spring MVC(二)
一.Spring MVC 验证 JSR 303 是ajvaEE6 中的一项子规范 ,叫 Bean Validation 用于对javaBean中的字段进行校验. 官方的参考实现是: Hibernate ...
- java企业架构 spring mvc +mybatis + KafKa+Flume+Zookeeper
声明:该框架面向企业,是大型互联网分布式企业架构,后期会介绍linux上部署高可用集群项目. 项目基础功能截图(自提供了最小部分) 平台简介 Jeesz是一个分布式的框架,提供 ...
- 第63节:Java中的Spring MVC简介笔记
前言 感谢! 承蒙关照~ Java中的Spring MVC简介笔记 MVC简介 Spring MVC 基本概念 Spring MVC 项目搭建 maven 使用Spring MVC进行开发 实现数据绑 ...
- Java方式配置Spring MVC
概述 使用Java方式配置Spring MVC,以及回顾一下Spring MVC的各种用法. Spring MVC简述 关于Spring MVC的介绍网上有很多,这里就不再赘述了,只是要说一下,Spr ...
- 【Java】关于Spring MVC框架的总结
SpringMVC是一种基于Java,实现了Web MVC设计模式,请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将Web层进行职责解耦.基于请求驱动指的就是使用请求-响应模型,框架的 ...
- 如何用Java类配置Spring MVC(不通过web.xml和XML方式)
DispatcherServlet是Spring MVC的核心,按照传统方式, 需要把它配置到web.xml中. 我个人比较不喜欢XML配置方式, XML看起来太累, 冗长繁琐. 还好借助于Servl ...
- [Java] Maven 建立 Spring MVC 工程
GIT: https://github.com/yangyxd/Maven.SpringMVC.Web 1. 建立 WebApp 工程 下一步: 下一步: 选择 maven-archetype-web ...
- java框架篇---spring AOP 实现原理
什么是AOP AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善.OOP引入 ...
- java框架之Spring(2)-注解配置IOC&AOP配置
注解配置IoC 准备 1.要使用注解方式配置 IoC,除了之前引入的基础 jar 包,还需要引入 spring-aop 支持包,如下: 2.在 applicationContext.xml 中引入 c ...
随机推荐
- 》》QQ-注册
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- leetcode:程序猿面试技巧
起因 写在开头,脑袋铁定秀逗了,历时20多天,刷完了leetcode上面151道题目(当然非常多是google的),感觉自己对算法和数据结构算是入门了,但仍然还有非常多不清楚的地方,于是有了对于每道题 ...
- DB主从一致性架构优化4种方法
需求缘起 大部分互联网的业务都是"读多写少"的场景,数据库层面,读性能往往成为瓶颈.如下图:业界通常采用"一主多从,读写分离,冗余多个读库"的数据库架构来提升数 ...
- 利用反射操作bean的属性和方法
今天在开发中碰到这样一个场景:当请求添加项目下的目录时,传过来的是一个IndexModel,这个Model里有关于这个目录字段的详细信息,包括基础报表,实时,漏斗等信息(这些字段类型都是boolean ...
- MVC(二)
一: 在新接触MVC的时候可以先使用VS建一个MVC项目(不是空项目哟),MVC特别人性化的建一个示例,展示了MVC项目的基本组成.如下: App_Data 数据库文件,需根据数据库变动而变更. Ap ...
- Material使用07 MatGridListModule的使用
1 MatGridListModule简介 对相似数据的展现,尤其是像是图片的展示 使用起来很像表格 官方文档:点击前往 2 MatGridListModule提供的指令 2.1 mat-grid-l ...
- Idea在导入有maven项目时,不能自动识别pom.xml
当在idea中导入maven项目时,不能自动识别pom文件,显示为普通橙色xml文件. 解决方法:点击最右侧侧边栏,点击添加(蓝的的小加号),选择你导入项目的pom.xml文件
- Struts2框架(3)---Action类的3种书写方式
Action类的3种书写方式 本文主要写有关写Action类的3种书写方式: (1)第一种 Action可以是POJO (简单模型对象) 不需要继承任何父类 也不需要实现任何接口 (2)实现Acti ...
- 腾讯WeTest《2017中国移动游戏质量白皮书》开放预约,再为国内手游把把脉
产品为王,质量先行.如果说2016年是爆款手游相继崛起的一年,那么2017年则更像是打磨精品.建立生态的高手切磋之年.守住一个游戏的质量生命线,方能建立健康生态,方能在如火如荼的行业竞争中角逐到最后. ...
- Wincc flexable的局势视图的组态
1.趋势视图介绍 2.实时趋势视图的组态 1)创建连接和变量 2)开始组态局势视图 3)设置趋势视图的属性,添加一个趋势 3.模拟运行HMI,观察局势图