您的位置:首页 > 编程语言 > Java开发

springmvc 初学 入门

2016-12-21 12:03 162 查看

mvc框架的共有特征:

架包的导入:

commons-logging-1.1.1.jar //日志架包

spring-aop-4.0.0.RELEASE.jar

spring-beans-4.0.0.RELEASE.jar

spring-context-4.0.0.RELEASE.jar

spring-core-4.0.0.RELEASE.jar

spring-expression-4.0.0.RELEASE.jar

spring-web-4.0.0.RELEASE.jar

spring-webmvc-4.0.0.RELEASE.jar

一.请求分发,
(url 定位到 一个java类的方法!!)
二.表单参数如何获取?
主动式?(servletAPI) 被动式?DI
三.跳转到模板
四.


一.请求分发:(三种)

1.servlet的方式:


@Controller
@RequestMapping("/demo")
public class DemoServlet {
@RequestMapping(method=RequestMethod.GET)
public void doGet(HttpServletRequest res,HttpServletResponse es){
System.out.println("get...");
}
@RequestMapping(method=RequestMethod.POST)
public void doPostt(HttpServletRequest req,HttpServletResponse res){
System.out.println("post...");
}
}
//访问方式:http://localhost:8080/springmvctest/demo.do


2.类似struts1的方式:


@Controller
@RequestMapping("/struts1")
public class StrutsController {
@RequestMapping(params="method=add")
public void findAll(){
System.out.println("add......");
}
@RequestMapping(params="method=findall")
public void findall(){
System.out.println("findall....");
}
}
//访问方式:http://localhost:8080/springmvctest/struts1.do?method=add


3.类似与struts2的方式:(常用的)


@controller
@requestmapping("/user")   (可以不用这个一样可以定位到!!)
public class UserController{
@requestmapping("/add")
public void add(){
System.out.println("add......")
}
}


访问方式:http://localhost:8080/springmvctest/user/add.do


4.springmvc在Controller的局部变量是用的一个变量,方法执行完了就被释放,而struts2的成员变量是一个action(请求)new一个对象,
就算是调用的是同一个action
5.默认的controller是单例的,


二.表单参数的获取:(一共三种获取了参数的方式。)

6.1)用(DI方式,方法参数的注入。)

@RequestMapping("/user/login") //<DI方式 方法参数的动态注入!!>
public void  login(@RequestParam("n")String uname,@RequestParam("p")String pwd){
System.out.println(uname+"....."+pwd);
}


访问方式:http://localhost:8080/springmvctest/user/login.do?n=renchenhao&p=1234


/**
* required 该参数是否必须,默认为true;
* defaultValue 请求参数的默认值;
* value值即请求参数的参数名;
* @return
*/
@RequestMapping(value="/testRequestParam")
public String testRequestParam(@RequestParam(value="username") String un
,@RequestParam(value="age",required = false,defaultValue="0") int ag){
System.out.println("username="+un+"age:"+ag);
return SUCCESS;
}
//http://localhost:8080/springmvctest/testRequestParam?username=renchen&age=11


6.2)模型驱动(一个java的类,用于参数的接受)

@RequestMapping("/user/add")
public void add(Uer uer){
System.out.println();
return SUCCESS;
}


//pojo类
//uer类
String username ;
String pwd;
Adress adress;
//省略get和set方法;
//adress类 //级联
String city;
//省略get和set方法


<form action="testPojo">
<input type="text" name="username"/>
<input type="text" name="pwd"/>
<input type="text" name="adress.city"/>
<input type="submit" value="submit"/>
</form>


(说明:传进来的值的属性名与user的类里面所声明的成员变量相同的就自动赋值给它,)


6.3)restFULL方式 (http,uri的更加充分的利用)

@RequestMapping("/user/{id}/del")
public void del(@PathVariable("id") Integer id){//http 的restfull风格
System.out.println("..........add....del"+id);
}


7.解耦 模拟环境 自动化测试– >>

三.跳转到模板:

怎么传递参数,构建响应体!
9.struts2中用的是result
10.在springmvc中是:  return "forward:/welcome.jsp";
(相对路径,requestmapping的路径)


@RequestMapping("/user/login") //DI方式 方法参数的动态注入!!
public String  login(@RequestParam("n")String uname,
@RequestParam("p")String pwd,HttpServletRequest session){
System.out.println(uname+"....."+pwd);
session.setAttribute("uname", uname);
return "forward:/welcome.jsp";  // 这里在forward:后面必须加一个/  不然就会使用相对路
//径,即把/user/addde之前的路径附在之前作为路径。
}


11.1)ModelMap是map的实现,可以在其中存放属性,作用域同request。通过
el表达式,jstl,java代码均可。
11.2)为了解耦,不推荐使用原生的HttpServletRequest而是使用ModelMap
12.有些面试官会问,你觉得struts2和springmvc框架的好处都是什么啊?
可以和环境解耦,便于环境测试!!
13.1)springmvc关于跳转(return "forward:/welcome.jsp"):简化!!但是,在一些特殊场景中,反到带来了不方便,
有些网站的设计人员,不想外部的人员直接访问,把工程放在了WEB-INF底下,
那么就得这样写(return "forward:/WEB-INF/welcome.jsp"),当网站较大时,这就带来了一个弊端,需要重复写
很多代码,这时就有了:"视图解析器(帮我们定位到某一个资源的)".
13.2)视图解析器:(如果在return 中没有家上 "forwward:" 那么就会使用到视图解析器)
在springmvc-servlet.xml中加上这样一条语句:


<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/ren/"></property>
<property name="suffix" value=".jsp"></property>
</bean>


14.重定向:返回值形如:return "redirect:http://www.baidu.com";
15.中文编码filter:
在web.xml中加上这样一条语句(这个控制乱码方法的只对post的提交方式有用.):


<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>


相当于servlet中的:
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");

16.ModelAndView模型视图类(和用ModelMap map相似):
见名知意,从名字上我们可以知道ModelAndView中的Model代表模型,View代表视图。即,这个类
把要显示的数据存储到了Model属性中,要跳转的视图信息存储到了View属性。我们来看下ModelA
ndView的部分源码,即可知其中的关系:


@RequestMapping("/user/add") //DI方式 方法参数的动态注入!!
public ModelAndView  login(@RequestParam("n")String uname,@RequestParam("p")String pwd){
System.out.println(uname+".../////.."+pwd);
ModelAndView mv= new ModelAndView();
mv.setViewName("hao/welcome");
mv.getModelMap().put("a", uname);
return mv;  // 把返回参数改为ModelAndView类型的
}


17.文件上传(spring使用了apache-commons下的上传组件,因此我们需要引入两个jar包,学了maven后可以自动导):
导包:
1).Apache-commons-fileupload.jar(这两个包可以在spring2.5.6中找到,或者在网上查找)
2).apache-commons-io.jar
----------------------------------------------
java文件代码:


package com.bjsxt.controller;
import java.io.File;
import java.io.IOException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

@Controller
public class UploadCont {
@RequestMapping("/toupload")
public String toUpload(){
return "hao/upload";
}
@RequestMapping("/upload")    //< !!!必须加上@RequestParam("file")!!!! >
public String upload(@RequestParam("file")CommonsMultipartFile file){
System.out.println(file.getOriginalFilename());

try {
file.transferTo(new File("D:/1.txt"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "ok";
}
}


spring-servlet.xml中的关于文件上传的相关代码:

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize"><value>1203500</value></property> <!-- 最大文件大小(-1为无限制) -->
<property name="defaultEncoding"><value>utf-8</value></property><!-- 默认编码 -->
<property name="maxInMemorySize"><value>10240</value></property><!-- 最大内存大小 -->
</bean>


---------------------------------------------
jsp页面代码:


<!--method必须是post    enctype必须是multipart/form-data-->
<form action="upload.do" method="post" enctype="multipart/form-data">
<input type="text" name="name" />
<input type="file" name="file"/> <!--  这里的name属性的名字为file这个和java文件中的传入的形参的名字要相同 -->
<input type="submit" />
</form>


----------------------------------------------
<注意:前后缀的问题>
18.1)
1)端对端模式(通俗点讲让浏览器专门处理浏览器js,html的,后台专门处理数据)
2)jsp在后台处理html,css,javascript(就是在后端处理前端的工作)
3).动态页面技术的发生是我们需要一种模板  -- 实现java,html,js等
代码复用(如jquery ui easyui)
AngularJs(不懂!)
18.2)
处理ajax请求(json):
手动的:
------------------------------------------
1.java代码:


package com.bjsxt.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.bjsxt.po.User;
@Controller
public class Ajax {
@RequestMapping(value="/byid",p
c41a
roduces="text/html;charset=utf-8")
public @ResponseBody String findById(Integer id){
User user= new User();
user.setId(id);
user.setName("ilsf");
user.setPhone("123456");
//这里可以使用json工具转化为字符串
return "{\"id\":1,\"name\":'小嘎',\"phone\":'adfsdf'}"; //手动转换
}
}


2.注意:
需要在spring-servlet.xml加上这一句话(必须加):<mvc:annotation-driven></mvc:annotation-driven>
最后的配置如果没有<mvc:annotation-driven/>,那么所有的Controller可能就没有解析,所有当有请求时
候都没有匹配的处理请求类,就都去<mvc:default-servlet-handler/>即default servlet处理了。添加上
<mvc:annotation-driven/>后,相应的do请求被Controller处理,而静态资源因为没有相应的Controller就
会被default servlet处理。总之没有相应的Controller就会被default servlet处理就ok了。<(这句话有待考究!!)>
3.心得:
如果不加<mvc:annotation-driven/>那么controller可能并没有被解析,而是交给了<mvc:annotation-driven/>处理,
有一点可以说明买就是当你拦截了全部请求的时候,就会显示404错误,这是如果加上<mvc:annotation-driven/>,错误就会消失。
//访问方式:http://localhost:8080/springmvctest/byid.do?id=1
接受json格式的数据:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring mvc mvc java