SpringMVC总结

来源:互联网 发布:everying软件缩略图 编辑:程序博客网 时间:2024/06/05 08:11
SpringMVC
MVC基本上已经是web的代名词. 就是一个mvc的框架.
struts是MVC框架的代表.
springMVC是spring框架的一个分支.一个技能点.
springMVC的好处:
1.更好的融合spring.
2.配置简单,全部使用注解来实现.
3.基本上做到了0配置


springMVC就是高效率.


步骤:
1>配置web.xml, DispatcherServlet类文件.
<servlet>
<servlet-name>springMVC</servlet-name>
//与springMVC-servlet.xml中的springMVC对应,这样就可以不用配置
<param-value>classpath:mvc.xml</param-value>了


<servlet-class>org.springframework.web.servlet.DispatcherServlet             
</servlet-class>
</servlet>


<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>*.spring</url-pattern>          
</servlet-mapping>


2>扫描注解==创建springMVC的自身的配置文件
在springMVC-servlet.xml(要与web.xml放在同级别的文件夹)中配置:
<!-- 扫描注解 --> //有了注解,类名与方法名没有用了,无关紧要
<context:component-scan base-package="controller"/>
3>请求index.jsp
<a href="hello.spring">你好</a>
4>注解Test1:
@Controller
public class Test1 {
@RequestMapping("hello")            
//与<a href="hello.spring">一致
//用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
//http://localhost:8888/SpringMVC_1_test1/hello
public void adsfasdf(){
System.out.println("HelloWorld!");
}
}


1.登录
UserAction类:
@RequestMapping("login")
public String test1(User u){  
//一定要提供无参构造(使用无参构造存参数),才可将参数存入User中     
System.out.println("欢迎登录~!");
if(u.getUsername().equals("sa") && u.getPassword()==123){
//springMVC自动类型转换
System.out.println( u.getPassword()+100);
return "ok.jsp";  //返回到ok.jsp页面
}
return "index.jsp";
}
2.配置文件的位置(springMVC-servlet.xml):
a)放在src中.
在web.xml中配置:
<init-param>
<param-name>ContextConfigLocation</param-name>               
<param-value>classpath:mvc.xml</param-value>
</init-param>


b)存放指定的路径
在web.xml中配置:
<init-param>
<param-name>ContextConfigLocation</param-name>
<param-value>spring/mvc.xml</param-value>
</init-param>


c)多个文件
在web.xml中配置:
<init-param>
<param-name>ContextConfigLocation</param-name>
<param-value>spring/mvc.xml,spring/mvc2.xml</param-value>
<!-- 配置多个mvc.xml -->              
</init-param>


3.路径重复 : 前台login.spring  后台也叫login.spring
struts中,叫定义包路径,用namespace区分
解决方案:springMVC中,叫定义父路径
index.jsp中:
<a href="q/denglu.spring">前台登录</a>


QianAction:
@Controller
@RequestMapping("q")  //定义父路径           
public class QianAction {
@RequestMapping("denglu")
public void test1(){
System.out.println("前台登录!~!~!");
}
}


4.重定向与转发
a)转发:
i.路径不变
ii.request保值


b)重定向
DeptAction:
@RequestMapping("getNames")
public String asdas(HttpServletRequest request){
System.out.println("得到全部的姓名");
request.setAttribute("names", names());
//request.getSession().setAttribute("names", names());
String name="乔丹";
return "haha.spring?name="+name;
//先调到haha.spring,最后跳到ok.jsp页面           
}


@RequestMapping("haha")
public String adfa(String name){
System.out.println(name+"笑一笑");
return "ok.jsp";
}


中文乱码处理:
在web.xml中配置过滤器,CharacterEncodingFilter类:
<filter>
<filter-name>encodingFilter</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>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>


5.url中提取变量
index.jsp:
<a href="phone/110/name/aaa.spring">匪警</a>


PhoneAction:
@RequestMapping("phone/{p}/name/{name}")  //{变量名} 通配符          
public void testa( @PathVariable String p, @PathVariable String name ){        
//@PathVariable  获得url中动态参数
System.out.println("电话号:" + p+"姓名:" + name);
}


不用看的项目:
SpringMVC_1_test1


一、SpringMVC使用开发技巧:
1.URL参数访问方法
类似 struts的动态方法.  testAction!a
在Action类中:
@RequestMapping(value="test1",params="A")     
/* value为请求的路径,params为请求参数
<a href="test1.spring?A"> params要与<a>标签一致*/
public void test1(){
System.out.println("AAA");
}


2.服务器端解析json


SpringMVC_2_test2


a)传统
index.jsp:
function send1(){
var user = new userinfo('sa','123');    //js中最好用单'  '
//object-1->jsonObject-2->jsonString
var jsonstr = JSON.stringify(user);//将实体对象转换成json字符串
alert(jsonstr);
//location.href='json1.spring?js='+jsonstr;//url传参
$.post("json1.spring",{"jsonstr":jsonstr});
//$.post(url  [ ,param]  [ ,function(data){ }回调函数]  [ ,dataType]),
//不需要回调函数
}


controller包:
@RequestMapping("json1")
public void dsasdf(String jsonstr){//与index.jsp中的var jsonstr对应
System.out.println(jsonstr);
JSONObject jo = JSONObject.fromObject(jsonstr);
//解析josn字符串:JSONObject  map | JSONObject.fromObject(javaBean);
//将json字符串-->json对象
System.out.println( jo.get("username") );
System.out.println( jo.get("password") );
}


b)springMVC特有的
步骤:
i.jar包的引入
ii.在springMVC-servlet.xml中配置
<mvc:annotation-driven/>       
iii.服务器端接收对象要提供无参构造
iv.服务器端接收对象前要加转换注解 @RequestBody
v.客户端需要指明提供参数的类型:
contentType:application/json


index.jsp:
function send2(){
var user = new userinfo('admin','321');
var jsonstr = JSON.stringify(user);
$.ajax({
type:"post",
data:jsonstr,
url:"json2.spring",
contentType:"application/json"
});
}


controller包:
@RequestMapping("json2")
public void dta(@RequestBody Userinfo userinfo){ //转换注解
//Userinfo必须提供无参构造
System.out.println(userinfo.getUsername());
System.out.println(userinfo.getPassword());
}


3.解析不同格式的json
a)数组
index.jsp:
function send1(){
var arr = new Array();
arr[0] = "a";
arr[1] = "b";
arr[2] = "c";
var jsonstr = JSON.stringify(arr);
$.ajax({
type:"post",
data:jsonstr,
url:"test1.spring",
contentType:"application/json"
});
}


controller包中:
@RequestMapping("test1")
public void test1(@RequestBody ArrayList<String> list) {
for (String s : list) {
System.out.println(s);
}
}


b)对象数组
index.jsp:
function send2(){
var arr = new Array();
arr[0] = new userinfo('a','111');
arr[1] = new userinfo('b','222');
arr[2] = new userinfo('c','333');
var jsonstr = JSON.stringify(arr);
$.ajax({
type:"post",
data:jsonstr,
url:"test2.spring",
contentType:"application/json"
});
}
controller包中:
@RequestMapping("test2")
public void test2(@RequestBody ArrayList<Map> list) {     
for (Map m : list) {
System.out.println(m.get("username") + "\t" + m.get("password"));
}
}


c)复杂的json对象
index.jsp:
function send3(){
var jsonObject ={
"username":"jordan",
"hobby":[{"ai1":"抽烟"},{"ai1":"喝酒"},{"ai1":"烫头"}],
"address":{"city":"北京","qu":"朝阳","street":"文化新大街"}
}; 
var jsonstr = JSON.stringify(jsonObject);
$.ajax({
type:"post",
data:jsonstr,
url:"test3.spring",
contentType:"application/json"
});
}


controller包中:
@RequestMapping("test3")
public void test3(@RequestBody Map m) {
System.out.println("姓名:" + m.get("username"));
List<Map> list = (List) m.get("hobby");        
System.out.print("爱好:");
for (Map hobby : list) {
System.out.print(hobby.get("ai1") + ",");
}
System.out.println();
Map add = (Map) m.get("address");         
System.out.println("地址:" + add.get("city") + "市" + add.get("qu") + "区" + add.get("street"));
}


4.服务器端返回json
index.jsp:
function send1(){
$.ajax({
type:"post",
url:"getJson.spring",
contentType:"application/json",
success:function(data){
//String -> object
var json = eval("("+data+")");     
alert(json.username);
}
});
}


controller包:
@RequestMapping("getJson")
public @ResponseBody String tgest(){     //也可以写在方法上方   
/*@RequestBody 将HTTP请求正文转换为适合的HttpMessageConverter对象。
@ResponseBody 将内容或对象作为 HTTP 响应正文返回,
并调用适合HttpMessageConverter的Adapter转换对象,写入输出流。*/
Userinfo user = new Userinfo("sa","123");
JSONObject jo = JSONObject.fromObject(user);
return jo.toString();
}

5.文件上传


SpringMVC_2_test3


a)单文件 :  commons-io-2.0.1.jar
依靠request对象,MultipartHttpServletRequest,此类不能单独使用,还缺少一个配置.
<!-- 上传多部件表单的请求适配器CommonsMultipartResolver类 ,id必须为multipartResolver-->


<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="2048000000"/>
<!-- 最大上传尺寸,value值单位为字节 -->
</bean>


controll包中:
@RequestMapping("uploadone")
public void adf(MultipartHttpServletRequest request,HttpServletResponse  response ) throws IOException {
//1.文件上传的目标文件夹(完整路径)
String path = request.getSession().getServletContext().getRealPath("/images");
//2.上传的文件
MultipartFile file = request.getFile("fname");
//3.从输入流中读取文件
InputStream in = file.getInputStream();
//4.获得文件名称
String fileName = file.getOriginalFilename();
//5.创建要上传的文件对象
File newFile = new File(path,fileName);
//6.上传输出流
FileOutputStream out = new FileOutputStream(newFile);
IOUtils.copy(in,out);//将字节从 InputStream复制到OutputStream中 
out.close();
in.close();
}


b)多文件
controll包中:
@RequestMapping("uploadmany")
public void adf(MultipartHttpServletRequest request,HttpServletResponse response ) throws IOException {
//文件上传的目标文件夹(完整路径)
String path = request.getSession().getServletContext().getRealPath("/images");
Map<String,MultipartFile> map = request.getFileMap();     
Set<String> fileSet = map.keySet(); //input框的name属性
Iterator<String> it = fileSet.iterator();
while(it.hasNext()){
//上传的文件
MultipartFile file = map.get(it.next());   
//读取文件
InputStream in = file.getInputStream();
//获得文件名称
String fileName = file.getOriginalFilename();
//创建要上传的文件对象
File newFile = new File(path,fileName);
//上传输出流
FileOutputStream out = new FileOutputStream(newFile);
IOUtils.copy(in,out);
out.close();
in.close();
}
}


6.文件下载

SpringMVC_2_test4


controller包中:
@RequestMapping("download")
public void ste(String url, HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException {
File f = new File(url);     
String fileName = f.getName();
fileName = new String(fileName.getBytes(),"iso-8859-1");      
try {
FileInputStream input = new FileInputStream(url);
// 以附件形式下载
response.setHeader("content-Disposition", "attachment;filename=" +    fileName);
OutputStream output = response.getOutputStream();
IOUtils.copy(input, output);
output.close();
input.close();
} catch (Exception e) {
e.printStackTrace();

}


7.视图适配器


SpringMVC_2_test5


在springMVC-servlet.xml中配置:
<!-- 视图适配器,InternalResourceViewResolverod类,id必须为viewResolver -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="WEB-INF/"/> <!-- 前缀 -->
<property name="suffix" value=".jsp"/>     <!-- 后缀 -->
</bean>


controller包中:
@RequestMapping("test1")
public String dsa() {
return "ok";
//return "hahaha";
}


1)视图适配器void情况
controller包中:
@RequestMapping("test2")
public void dafdsa() {
// 自动调转到WEB-INF/test2.jsp
}


2)返回list情况
controller包中:
@RequestMapping("test3")
public List<String> tasd(){
List<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");
return list;
// 自动调转到WEB-INF/test3.jsp,随@RequestMapping("test3")走
}


index.jsp:
<h1>${requestScope.stringList}</h1>        
<!-- 返回为List<String>,要倒着写stringList(键),并将结果封装到request域对象中 -->
3)返回实体对象情况 
controller包中:
@RequestMapping("test4")
public Userinfo dafddasa() {
//requset中的键值==对象的类型userinfo,存入request域对象中
Userinfo x = new Userinfo("kobe","123");
return x;
}


二、拦截器


SpringMVC_2_test6


拦截某些操作,实现更加健硕的功能.


步骤:
1>编写拦截器类:
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
public class CheckUser extends HandlerInterceptorAdapter {
//进入购物车.判断是否登陆过。
//继承HandlerInterceptorAdapter类,重写preHandle()方法       
String urls[] = { "car.spring", "xx.spring" };//只拦截含有.spring的路径
public boolean preHandle(javax.servlet.http.HttpServletRequest request,
javax.servlet.http.HttpServletResponse response, java.lang.Object handler) throws java.lang.Exception {
System.out.println("拦截!!!!");
String url = request.getRequestURI();
System.out.println(url);
for (String u : urls) {
if (url.contains(u)) { //有需要拦截的路径了
if (request.getSession().getAttribute("user") == null) {
response.sendRedirect("login.jsp");
return false;
}
}
}
return true;
}
}


2>在springMVC-servlet.xml中配置:
<!-- 配置拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>  <!-- 全部拦截 -->
<bean id="checkUser" class="interceptor.CheckUser"/>
</mvc:interceptor>
</mvc:interceptors>


三、注入依赖


SpringMVC_2_test7


a)单个
b)多个
UserAction类:
@Controller
public class UserAction {
@Resource(name="china")  //指定自动装配的实现类
UserBiz userbiz;//依赖的是接口.该接口有多个实现类.
@RequestMapping("getName")
public String getName(HttpSession session){
session.setAttribute("list", userbiz.getName());
return "ok";
}
}


UserBizChina中:
@Service(value="china")
public class UserBizChina implements UserBiz {  }
UserBizEnglish中:
@Service(value="english")
public class UserBizEnglish implements UserBiz {  }


有疑问的地方 
@RequestBody 
<mvc:annotation-driven/>
HandlerInterceptorAdapter
@Resource
@Service(value="china")


另一版本:第一节:SpringMVC 简介


SpringMVC 是一套功能强大,性能强悍,使用方便的优秀的MVC 框架;


第二节:SpringMVC 版HelloWorld 实现


web.xml:


<!-- 配置SpringMVC的Servlet,DispatcherServlet类 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 加载spring-mvc.xml配置文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>


spring-mvc.xml:


<!-- 使用注解的包,包括子集 -->
<context:component-scan base-package="com.java1234"/>


<!-- 视图解析器 ,InternalResourceViewResolver类-->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp"></property>
</bean>


@Controller
public class HelloWorldController {


//@RequestMapping()参数要与请求链接对应 <a href="helloWorld.do">
@RequestMapping("/helloWorld")
public String helloWorld(Model model){
//Model对象,相当于request对象
//model.addAttribute("参数名","参数值") 添加属性到Model中
model.addAttribute("message", "SpringMvc大爷你好!");
return "helloWorld";
}
}


第二章 SpringMVC 控制器
第一节:@RequestMapping 请求映射
第二节:@RequestParam 请求参数
第三节:ModelAndView 返回模型和视图


@RequestMapping("/list")
public ModelAndView list(){
//ModelAndView 对象
ModelAndView mav=new ModelAndView();
//mav.addObject("属性名","属性值") 向ModelAndView中添加属性
mav.addObject("studentList", studentList);
//mav.setViewName("student/list") 设置视图名
mav.setViewName("student/list");
return mav;
}


@RequestMapping("/preSave")
public ModelAndView preSave(@RequestParam(value="id",required=false) String id){
/*@RequestParam(value="id",required=false) 获取请求参数,value指定参数名
required=false 指明id值不是必须的,默认是true,且会报错*/
ModelAndView mav=new ModelAndView();
if(id!=null){
mav.addObject("student", studentList.get(Integer.parseInt(id)-1));
mav.setViewName("student/update");
}else{
mav.setViewName("student/add");
}
return mav;
}