springmvc简单总结.docx
《springmvc简单总结.docx》由会员分享,可在线阅读,更多相关《springmvc简单总结.docx(84页珍藏版)》请在冰豆网上搜索。
springmvc简单总结
Springmvc的简单总结
一:
springmvc的简单了解
1..Springmvc是spring的web框架围绕DispatcherServlet设计的。
DispatchServlet的作用是将请求分发到不同的处理器。
Spring的web框架可以包括可配置的处理器(Handlder)映射,视图(view)解析,本地化(local)解析,主题(theme)解析以及对文件上传的支持等
2.springmvc的请求模式:
3.其实,每个MVC 框架的执行过程都是大同小异的;
①当一个request过来时,它通过一个servelet来响应request;
②再根据request的路径名和配置将这个request dispatch 给一个controller执行;
③最后将之返回配置文件里对应的页面。
在springmvc中,这个servelet的名字叫:
Dispatchservlet
4.Spring的Controller是singleton的,或者是线程不安全的说明。
分析:
和Struts一样,Spring的Controller是singleton的!
这意味着每个request过来,系统都会用原来的instance去处理,这样就导致了两个结果:
①我们不用每次创建Controller,减少了对象创建和垃圾回收的时间。
②由于只有一个Controller的instance,当多个线程调用它的时候,它里面的instance变量不是线程安全的。
这也是webworks吹嘘的地方,它的每个Action都是线程安全的。
因为每过来一个request,它就会创建一个Action对象。
由于现代JDK垃圾收集动能的效率已经不成问题了,所以这种创建完一个对象就扔掉的模式也得到很多人的认可。
二:
简单的配置了解
1.导入需要的jar包
【去网上搜一下】
2.配置web.xml
--springmvc的配置-->
--此处的name关系到springmvc-servlet.xml中springmvc名称-->
springmvc
org.springframework.web.servlet.DispatcherServlet
1
springmvc
/
--
说明:
此处的配置如果为*.do,那么我们请求的地址应该为:
http:
//localhost:
8080/springmvc/user/login.do
如果此处配置的地址为/,那么我们的请求地址应该为:
http:
//localhost:
8080/springmvc/user/login
*.do
-->
--/表示过滤所有-->
3.配置springmvc-servlet.xml
说明,可以放在WEB-INF下面就行。
有些配置是暂时不需要的,一并拷贝过来了。
xmlversion="1.0"encoding="UTF-8"?
>
//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"
xsi:
schemaLocation="
http:
//www.springframework.org/schema/beans
http:
//www.springframework.org/schema/beans/spring-beans-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/mvc
http:
//www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
--指定一个包让其自动扫描
component-scanbase-package="com.hanchao.web"/>
component-scanbase-package="com.hanchao.excel"/>-->
component-scanbase-package="com.hanchao.*"/>
--默认的注解映射的支持-->
annotation-driven/>
--下面注释的部分表示:
强调所有的请求都要经过springmvc框架-->
default-servlet-handler/>
--放行了以/static/开始的请求
resourceslocation="/static/"mapping="/static/**"/>-->
--当一个方法完全是为了跳转时,我们可以省略该方法,而在此写一个配置就行了-->
view-controllerpath="/index"view-name="index"/>
view-controllerpath="/main"view-name="main"/>
view-controllerpath="/success"view-name="success"/>
view-controllerpath="/user/demo_ajax_post2"view-name="ajax_post2"/>
view-controllerpath="/excel/toexcel"view-name="excel_demo"/>
--配置springmvc的视图解析器-->
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
--文件上传解析器-->
class="mons.CommonsMultipartResolver">
4.在WebRoot下面建立一个文件夹static用于放静态的文件,
static下面再建立三个静态文件夹:
images[用于放图片],script[用于放js文件],style[用于放css文件]
5.在WEB-INF下面建立一个文件夹views,用于放jsp文件。
可以先建立一个工程引用的jsp文件,base.jsp
<%@pagelanguage="java"import="java.util.*"pageEncoding="UTF-8"%>
<%@taglibprefix="c"uri="
<%
Stringpath=request.getContextPath();
StringbasePath=request.getScheme()+":
//"+request.getServerName()+":
"+request.getServerPort()+path;
pageContext.setAttribute("basePath",basePath);
%>
三:
基本功能的学习
建立一个index.jsp,引入base.jsp→<%@includefile="base.jsp"%>
1.简单的请求
packagecom.hanchao.web;
importjava.util.Date;
importorg.springframework.stereotype.Controller;
importorg.springframework.web.bind.annotation.PathVariable;
importorg.springframework.web.bind.annotation.RequestMapping;
importorg.springframework.web.bind.annotation.RequestMethod;
/**
*首页的处理
*@authorhanchao
*2012-02-24
*/
@Controller
publicclassApplicationController{
//@RequestMapping(value="/",method=RequestMethod.GET)
@RequestMapping("/")
publicStringindex(){
System.out.println("WelcometospringMVC!
!
");
System.out.println("2013-01-03-han-add================="+String.format("%1$tY年%1$tm月%1$te日",newDate()));
//return"index";//这样就请求转发去了index.jsp中了
/**注意事项:
重定向到reidrect:
/index时。
必须有对应的RequestMapping("/index")*/
return"redirect:
/index";//重定向到index.jsp
}
/*@RequestMapping("/index")
publicStringtoIndex(){
System.out.println("去首页。
。
。
。
。
。
");
return"index";
//说明:
如果一个方法仅仅是为了跳转,那么我们可以直接在springmvc-servlet.xml中加上如下的配置即可:
//view-controllerpath="/index"view-name="index"/>
}*/
/**
*放行/url1/url2的请求
*hanchao
*2013-03-04
*/
publicStringcommonURL(@PathVariable("URL1")StringURL1,
@PathVariable("URL2")StringURL2){
return"/"+URL1+"/"+URL2;
}
/**
*放行/url1/url2/url3的请求
*hanchao
*2013-03-04
*/
publicStringcommonURL(@PathVariable("URL1")StringURL1,
@PathVariable("URL2")StringURL2,@PathVariable("URL3")StringURL3){
return"/"+URL1+"/"+URL2+"/"+URL3;
}
}
注意事项:
①红色部分的@Controller,
②对于公共的URL,我们可以注释到类的头部,比如对于user对象的操作,
我们可以再action的头部注释:
@RequestMapping("/user")
③对于某些请求我们可以限制提交方式,比如用户登录,我们只允许POST提交,
我们可以在方法上面加上:
@RequestMapping("/login",method=RequestMethod.POST)
2.增
Controller:
/**
*对t_user表的处理
*@authorchao
*2013-03-02
*/
@Controller
@RequestMapping("/user")
publicclassUserController{
}
说明:
①
Modelmodel,HttpServletRequestrequest,ModelMapmap声明变量
request.getSession().setAttribute("test","haiwei2Session");
request.setAttribute("test","haiwei1request");
map.addAttribute("test","haiweiModelMap");
model.addAttribute("test","haiweiModel");
我通过${test}这个方式取值,优先取Model和ModelMap的,
Model和ModelMap是同一个东西,谁最后赋值的就取谁的,然后是request,最后是从session中获取
:
如果我们在类名上配置一个@RequestMapping("/user")的话
*我们在每个方法上就不需要配置了@RequestMapping("/login")
*否则,方法上需要这么配置:
@RequestMapping("/user/login")
①.表单提交(增)
--**************1**************-->
1.表单提交(增)
--表单默认:
method="get"-->
Username:
Sex:
对应的UserController.java中的方法:
/******************
*用户登录
该例子涉及到表单提交传值,一种是表单中的值name="username"和User对象中的username属性名相同;
*另一种是和对象的属性没有关系的,比如:
sex;;
*该例子还涉及到session的使用,当然,如果你想使用request,response,
*直接在参数中加HttpServletRequestrequest,HttpServletResponse即可
*
*如果我们要限制提交的方式:
我们把@RequestMapping("/login")改成
*@RequestMapping(value="/login",method=RequestMethod.POST)
*hanchao
*2013-03-04
****************
*
*/
@RequestMapping("/login")
publicStringlogin(
Useruser,
Stringsex,
Modelmodel,
HttpSessionsession,
HttpServletRequestrequest){
System.out.println("页面传来的用户名:
"+user.getUsername());
System.out.println("页面传来的性别:
"+sex);
//向页面传值的方式
model.addAttribute("username",user.getUsername());
model.addAttribute("sex",sex);//不用传不行
//用session传值
session.setAttribute("demo","session传值");
//request传值
request.setAttribute("demoRequest","request传值");
//传一个对象到页面(传一个集合或者map是相同的方式)
//model.addAttribute("user",user);//不用传也行,因为方法里的对象参数会自动的被放入reqeust中
//return"forward:
/user/login1";
return"main";
//return"redirect:
/main";//这种重定向的跳转方式,不能传值model;还必须要配置view-controllerpath="/main"view-name="main"/>;或者自己写一个跳转的方法;
}
当然,无论是POST还是GET方式,我么也可以这样:
publicStringlogin1(Stringusername,Stringsex,Modelmodel,HttpServletRequestrequest){
System.out.println("login1....");
System.out.println("--------:
"+request.getRequestURL());
System.out.println("页面传来的用户名:
"+username);
System.out.println("页面传来的性别:
"+sex);
return"main";
}
用ModelAndView向页面传值
/******************
*用户登录此例子用的ModelAndView向页面进行传值了。
并限制了,提交的方法为post;如果你把form表单的提交方式修改了就会报错了。
*和上面一个例子有异曲同工之处。
*hanchao
*2013-03-04
****************
*
*
*/
@RequestMapping(value="/login",method=RequestMethod.POST)
publicModelAndViewlogin(Useruser,Stringsex){
ModelAndViewmav=newModelAndView();
//要跳转的页面
mav.setViewName("main");
//向页面传值
mav.addObject("username",user.getUsername());
mav.addObject("sex",sex);
//向要跳转的传个对象
mav.addObject("user",user);
returnmav;
}
3.删
2.删
删除id为25的用户(后台代码有map的例子)
void(0)"id="del">删除id为25的用户___ajax
js
$("#del").click(function(){
varbasePath=$("#basePath").val();
alert(basePath+"/user/delajax/25");
$.get(basePath+"/user/delajax/25",function(data){
if(data=='ok'){
alert("删除成功!
");
}else{
alert("删除失败!
!
");
}
});
});
Controller:
/*****************
*根据用户ID删除用户
*
*此处的例子是url传值的方式的例子,
*/del/{id}中的id尽量和@PathVariableStringid中的id的值保持一致。
*
*hanchao
*2013-03-04
****************
*
*
*/
@RequestMapping("/del/{id}")
publicStringdel(@PathVariableStringid,Modelmodel){
System.out.println("要删除的用户的ID为:
"+id);
model.addAttribute("flag","ok");
//map向页面的传值的例子
Mapmap=newHashMap