springmvc学习笔记

springmvc深入学习记录 相信很多小伙伴们大概和我一样吧,做程序也好久了用springmvc也写过一两个项目了 但是 却发现我们一点都不了解springmvc好多东西只要出错就去网上找,完全不经过大脑的思考,或者离开了网络就不知所措 其实并不是因为笨 只是我们没有真正的了解他,当你突然知道重定向或者一个注解可以做这么多事的时候不如先停下来看看 我门是有多不了解他们。(本文只针对springmvc的基本用法,大牛请绕道)
一、创建web应用就不用说了,(记得将应用修改为3.0的版本)项目结构如下




二、需要的jar包




三、配置web.xml文件
  <?xml version="1.0" encoding="UTF-8"?>
  <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xmlns="http://java.sun.com/xml/ns/javaee" 
       xsi:schemaLocation="http://java.sun.com/xml/ns/javaee                       
   http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
 
  <!-- 配置org.springframework.web.filter.HiddenHttpMethodFilter:
可以吧POST请求转为DELE TE和PUT -->
<filter>
  <filter-name>HiddenHttpMethodFilter</filter-name>
  <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>

<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

  <!-- 配置DispatcherServlet -->
  <servlet>
     <servlet-name>springDispatcherServlet</servlet-name>
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <!-- 配置springDispatcherServlet的一个初始化参数 :
配置springMVC配置文件的位置和名称 -->
  <init-param>
  <!-- 找到springmvc的配置文件 -->
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath:springmvc.xml</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
  </servlet>
 
  <servlet-mapping>
  <servlet-name>springDispatcherServlet</servlet-name>
  <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>


四、配置springmvc.xml文件(上面都附有注释 自己慢慢看吧)
<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
       xmlns:context="http://www.springframework.org/schema/context"  
       xmlns:mvc="http://www.springframework.org/schema/mvc"  
       xsi:schemaLocation="http://www.springframework.org/schema/beans  
       http://www.springframework.org/schema/beans/spring-beans.xsd  
       http://www.springframework.org/schema/context  
       http://www.springframework.org/schema/context/spring-context.xsd  
       http://www.springframework.org/schema/mvc  
       http://www.springframework.org/schema/mvc/spring-mvc.xsd"> 


    <!--配置自动扫描的包 -->
    <context:component-scan base-package="com.jushang.springmvc"></context:component-scan>
    
    <!-- 配置视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/view/"></property>
    <property name="suffix" value=".jsp"></property>
    </bean>

<!-- 配置自定义视图解析器 
通过order属性来定义视图解析器的优先级,order值越小优先级越高
-->
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
<property name="order" value="100"></property>
</bean>

<!-- 配置国际化资源文件 -->
<bean id="messageSource"
class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="i18n"></property>
</bean>

<!-- 配置直接转发的页面  可以直接转到该页面 不需要用方法进行跳转
*但是会影响以前的访问这个页面的方法无法访问
-->
<mvc:view-controller path="/success" view-name="success"/>

<!-- 上面直接访问的方法配置上下面的内容就能即可以直接访问也可以通过方法转发来进行访问 -->
<mvc:annotation-driven></mvc:annotation-driven>

</beans>


五、创建两个实体类用于测试springmvc的模拟有数据库^.^
public class User { 
//主键id 
private Integer id;
//用户名 
private String username; 
//密码 
private String password; 
//电话
private String tell; 
//地址(这里对应的是Address实体类)
private Address address;


}

public class Address { 
//省份
private String province;
//城市 
private String city;
}
get/set方法我就偷个懒不写了你们自己写呵呵!(eclipse下)
(告诉你个秘密好Shift+Alt+s然后选择gets And set 生成getset方法)
(Shift+Alt+s 选择tostring 生成tostring方法)
(Shift+Alt+s 选择Generate Constructor using Fields 生成构造器)


六、在index.jsp如下(下面的都是用来测试各个springmvc的作用和功能的)


<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
<a href="helloword">Helloween</a>
<a href="springmvcTest/springmvc">点击</a>
<br />
<a href="springmvcTest/testmethod">测试method</a>

<form action="springmvcTest/testmethod" method="post">
<input type="submit" value="提交">
</form>

<a href="springmvcTest/testParamsAndHeadrs?username=tom&age=10">测试testParamsAndHeadrs</a>


<br />
<a href="springmvcTest/testPathVariable/1">测试pathVariable</a>

<br />
<a href="springmvcTest/testRest/1">Test Rest GET</a>

<form action="springmvcTest/testRest" method="post">
<input type="submit" value="Test POST">
</form>

<form action="springmvcTest/testRest/1" method="post">
<input type="hidden" name="_method" value="DELETE" />
<input type="submit" value="Test DELETE" />
</form>

<form action="springmvcTest/testRest/1" method="post">
<input type="hidden" name="_method" value="PUT" />
<input type="submit" value="Test PUT" />
</form>

<br />
<a href="springmvcTest/testRequestParam?username=tomages&age=">testRequestParam</a>

<br />
<a href="springmvcTest/testRequestHeadrs">testRequestHeadrs</a>

<br />
<a href="springmvcTest/testCookeValue">testCookeValue</a>

<br /><br />
<form action="springmvcTest/testPOJO" method="post">
username:<input type="text" name="username"  />
password:<input type="password" name="password"  />
tell:<input type="text" name="tell"  />
city:<input type="text" name="address.city"  />
province<input type="text" name="address.province"  />
<input type="submit" value="提交" />
</form>


<br />
<a href="springmvcTest/testServletApi">testservletAPI</a>

<br />
<a href="springmvcTest/testmodelAndview">testmodelAndview</a>

<br />
<a href="springmvcTest/testSessionAttrbutes">testSessionAttrbutes</a>

<br /><br />
<!-- 模拟修改操作 
原始数据:1,tom,123456,1234567
-->
<form action="springmvcTest/testModelAttribute" method="post">
id:<input type="hidden" name="id" value="1"  />
username:<input type="text" name="username" value="tom"  />
tell:<input type="text" name="tell" value="1234567"  />


<input type="submit" value="提交" />
</form>

<br />
<a href="springmvcTest/testViewAndViewResolver">testViewAndViewResolver</a>

<br />
<a href="springmvcTest/testView">testView</a>

<br />
<a href="springmvcTest/testRedirect">testRedirect</a>

</body>
</html>




七、控制层的springmvcTest
package com.jushang.springmvc.controller;


import java.io.IOException;
import java.io.Writer;
import java.util.Date;
import java.util.Map;


import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.servlet.ModelAndView;


import com.jushang.springmvc.entity.User;


/**作者 :Li shilin  
* @type 类说明:
*/
@SessionAttributes(value = {"user"},types= {String.class})
@RequestMapping("/springmvcTest")
@Controller
public class SpringmvcTest {

private static final String SUCCESS = "success";

/**
* 重定向的方法使用
* @return
*/
@RequestMapping("/testRedirect")
public String testRedirect() {
System.out.println("testRedirect");
return "redirect:/index.jsp";
}

/**
* 转到自定义视图
* @return
*/
@RequestMapping("/testView")
public String testView() {
System.out.println("testView");
return "helloViews";
}


@RequestMapping("/testViewAndViewResolver")
public String testViewAndViewResolver() {
System.out.println("testViewAndViewResolver");

return SUCCESS;
}



/**
* 有@ModelAttribute标记的方法,会在每个目标方法执行之前被springmvc调用
* 在执行其他方法时也会被执行

*/
@ModelAttribute
public void getUser(@RequestParam(value = "id",required = false) Integer id,Map<String, Object> map) {

if (id != null) {
//模拟从数据库中拿到数据
User user = new User(1, "Tom", "123456", "1234567");
System.out.println("数据库中获取的对象:"+user);
map.put("user", user);
}
}

/**
*使用@ModelAttribute注解的运行流程
*1. 从数据库中取出对象,把对象放到map中 减为:user
*2.Springmvc从map中取出User对象,并把表单的请求参数赋给该User对象的属性
*3.springmvc 把上述的对象传入目标方法的参数
*
*注意:在@MOdelAttribute修饰的方法中,放入到Map中时的键需要和目标方法入参类型的第一个字母小写的字符串一致(就是和实体类的名称要一致 但是首字母要小写)
*
*Springmvc确定目标方法POJO类型参数的过程
*1.确定一个key:
*1).若目标方法的POJO类型的参数没有使用@ModelAttribute 作为修饰,则key为POJO类名第一个字母的小写
*2).若使用了@ModelAttribute来修饰 则key为@MOdelAttribute注解的value属性
*2.在implicitModel中查找key对应的对象,若存在,则作为参数传入
*1).若在@ModelAttribute标记的方法中在map中保存过,且key和1确定的key一致,则会获取到
*3.若implicitModel中存在key对应的对象,则检查当前的Handler 是否使用@SessionAttributes注解修饰
*若使用的该注解,且@SessionAttributes注解的value值中包含了key,则会从HTTPSession中获取key所对应的value值,若存在直接传入目标方法的参数中
*如果不存在就抛出异常
*4.若Headler没有标识@SessionAttributes 注解 或@SessionAttributes注解的value值中不包含key,则会通过反射来创建POJO类型的参数,传入
*为目标方法的参数
*5.SpringMVC会把key和POJO类型的对象保存在implicitModel中,进而会保存在request中。
*
*源码分析:
*1.调用@ModelAttribute 注解修饰的方法,实际上把@ModelAttribute方法中Map中的数据放在了implictModel中。
*2.解析请求处理器的目标参数,实际上该目标参数来自于WebDataBinder对象的target属性
*1).创建WebDataBinder对象:
*①.确定ObjectName属性:若传入的AttrName 属性值为"",则objectName为类名的第一个字母小写
**注意:attrName,若目标方法的POJO属性使用了@ModelAttribute来修饰,则attrName值即为@ModelAttribute的Value属性值
*
*②.确定target属性
*>在impliciModel中查找attrName 对应的属性值 ,若存在 ok
*>* 若不存在:则验证当前Handler 是否使用了@SessionAttrbutes进行修饰,若使用了,则尝试从session中获取attrName 对应的属性值
*,若session中没有对应的属性值,则抛出异常
*>若Hander没有使用@SessionAttrbutes进行修饰,或@SessionAttrbutes中没有使用value值指定的key和attrName相匹配,则通过反射创建了
*POJO
*
*2).SpringMvc把表单的求情参数赋给了WebDataBinder的target对应的属性.
*3).*springmvc会把WebDataBinder的attrName和target给到implicitModel,进而传到request域对象中
*4).把WebDataBinder的target作为参数传递给目标方法的入参
*
*/

@RequestMapping("/testModelAttribute")
public String testModelAttribute(User user) {
System.out.println("修改:"+user);
return SUCCESS;
}

/**
* @SessionAttributes 除了可以通过属性名指定需要放到回话中的属性外(实际上使用的是 value值的属性)
* 还可以通过模型属性的对象类型指定那些模型属性需要放到会话中(使用的是type值的属性值)
* * 这个注解只能放在类的上面 不能放在放法的上面

*/

@RequestMapping("/testSessionAttrbutes")
public String testSessionAttrbutes(Map<String, Object> map) {
User user  = new User("Toms","123456","45478454");
map.put("user", user);
map.put("school", "xinhau");

return SUCCESS;
}



/**
* requestmapping可以定义在类上面  也可以定义在方法上面
* @return
*/

@RequestMapping("/springmvc")
public String testRequestMapping() {
System.out.println("testRequestMapping");
return SUCCESS;
}

/**
* 使用method的方式来指定提交的方式是什么
* @return
*/
@RequestMapping(value = "/testmethod" , method = RequestMethod.POST)
public String testMethod() {
System.out.println("testMethod");
return SUCCESS;
}


/**
* 使用params 和headrs 来更加精确的映射表达,params 和 headrs支持简单的表达
* @return
*/

@RequestMapping(value ="/testParamsAndHeadrs" , params = {"username","age != 10"} ,headers = {"Accept-Language:zh-CN,zh;q=0.9"})
public String testParamsAndHeadrs() {

System.out.println("testParamsAndHeadrs");
return SUCCESS;
}

/**
* spring3.0之后支持 占位符注解
* @PathVariable 可以映射URL 中的占位符到目标方法的参数中
* @param id
* @return
*/
@RequestMapping("/testPathVariable/{id}")
public String testPathVariable(@PathVariable("id") Integer id) {
System.out.println(id);
return SUCCESS;
}
/**
* Rest 风格的URL
* 以CRUD为例:
* 新增: /order   post   
* 修改:/order/1  put    update?id=1
* 获取:/order/1  get get?id=1
* 删除:/order/1  DELETE delete?id=1

* 如何发送put和delete请求
* 1.需要配置HiddenHttpMethodFilter
* 2.需要发送POST请求
* 3.需要在发送Post请求是携带一个name="_method" 的隐藏域,值为DELETE或PUT

* 在springMVC的目标方法中得到id的方式是:@PathVariable注解



*/

@RequestMapping(value = "/testRest/{id}", method = RequestMethod.GET)
public String testRest(@PathVariable Integer id) {
System.out.println("TestRest GET:"+id);
return SUCCESS;
}

@RequestMapping(value = "/testRest", method = RequestMethod.POST)
public String testRest() {
System.out.println("TestRest post:");
return SUCCESS;
}


@RequestMapping(value = "/testRest/{id}", method = RequestMethod.DELETE)
public String testRestDelete(@PathVariable Integer id) {
System.out.println("TestRest DELETE:"+id);
return SUCCESS;
}

@RequestMapping(value = "/testRest/{id}", method = RequestMethod.PUT)
public String testRestPut(@PathVariable Integer id) {
System.out.println("TestRest PUT:"+id);
return SUCCESS;
}

/**
* @RequetParam 来映射请求参数
* value 值即请求的参数ming
* required 该参数是否必须,默认为true
* defaultValue 请求参数的默认值    这里一般不用写  接收的变量最好使用包装类 这样便利

*/

@RequestMapping(value = "/testRequestParam")
public String testRequestParam(@RequestParam(value = "username") String name, 
@RequestParam(value = "age" ,required = false) Integer age) {
System.out.println("testRequestParam, username="+name+",age="+age);
return SUCCESS;
}

/**
* 了解
* 映射请求头信息
* 用法:@RequestHeader

*/

@RequestMapping("/testRequestHeadrs")
public String testRequestHeadrs(@RequestHeader(value = "Accept-Language") String al) {
System.out.println("Accept-Language:"+al);
return SUCCESS;
}

/**
* @CookieValue
* 获取一个cookie值
* 用法 用法都是一样的
* */
@RequestMapping("/testCookeValue")
public String testCookeValue(@CookieValue("JSESSIONID") String sessionid) {
System.out.println("sessionid:"+sessionid);
return SUCCESS;
}


/**
* 用java的对象来提交数据 这样方便 
* 级联属性 :一个entity 用到另一个entity 提交的时候直接写原entity中的属性的在点另一个entity的属性
* @param user
* @return
*/
@RequestMapping("/testPOJO")
public String testPOJO(User user) {
System.out.println("testPOJO:"+user);
return SUCCESS;
}

/**
*可以使用servlet原生的API 作为目标方法的参数 具体支持的类型有:
*HttpServletRequest
*HttpServletResponse
*HttpSession
*java.security.Principal
*Locale   InputStream
*OutputStream
*Reader
*Writer 
* @throws IOException 
*/
@RequestMapping("/testServletApi")
public String testServletApi( HttpServletRequest request,HttpServletResponse response,Writer out) throws IOException {
System.out.println(request+","+response);
out.write("呵呵 这就是原生的servletApi");
return SUCCESS;
}

/**
* 目标方法的返回值可以是ModelAndView类型
* 其中包含视图和模型信息
* springMVC会把ModelAndView的model中的数据放入到request域对象中
* @return
*/
@RequestMapping("/testmodelAndview")
public ModelAndView testmodelAndview() {
String viewName = SUCCESS;
ModelAndView modelAndView = new ModelAndView(viewName);

//添加模型数据到modelAndview中
modelAndView.addObject("time", new Date());

return modelAndView;
}



}

八、显示结果的success.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
 <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>


<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
<h1>HEllo Word!</h1>
time :${requestScope.time}
<br /><br />
request user: ${requestScope.user}
<br /><br />
session user: ${sessionScope.user}
<br /><br />
request school: ${requestScope.school}
<br /><br />
session school: ${sessionScope.school}

<br /><br />
<fmt:message key="i18n.username"></fmt:message>

<br /><br />
<fmt:message key="i18n.password"></fmt:message>

</body>
</html>



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值