SpringMVC学习第一天(入门程序,请求参数的绑定,配置解决中文乱码的过滤器,自定义类型转换器,常用注解)
一、MVC设计模型Mmodel模型 JavaBeanVView视图JSPCController控制器 Servlet二、SpringMVC是什么SpringMVC是-种基于Java的实现MVC设计模型的请求驱动类型的轻量级Web框架,属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring框架提供了构建Web应用程序的全功能MVC模块。使用Sprin
一、MVC设计模型
M model模型 JavaBean
V View视图 JSP
C Controller控制器 Servlet
二、SpringMVC是什么
SpringMVC是-种基于Java的实现MVC设计模型的请求驱动类型的轻量级Web框架,属于Spring
FrameWork的后续产品,已经融合在Spring Web Flow里面。Spring框架提供了构建Web应用程序的全功
能MVC模块。使用Spring可插入的MVC架构,从而在使用Spring进行WEB开发时,可以选择使用Spring
的Spring MVC框架或集成其他MVC开发框架,如Struts1 (现在一般不用),Struts2等。
它通过一套注解,让一个简单的Java类成为处理请求的控制器,而无须实现任何接口。同时它还支持
RESTful编程风格的请求。
三、Spring入门程序
需求:点击超链接发送请求-->编写类-->编写方法-->转发到成功JSP页面
1、搭建开发的环境
<properties>
<!-- 版本锁定 -->
<spring.version>5.0.2.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
2、编写入门的程序
详情看springmvc_day01_01_start此工程。
3、入门程序的简略讲解
4、入门程序整体流程图
5、开启SpringMVC框架注解mvc:annotation-driven/
作用:开启SpringMVC框架注解的支持
描述:使用<mvc:annotation-driven>自动加载RequestMappingHandlerMapping(处理映射器)和RequestMappingHandlerAdapter(处理适配器),可用在SpringMVC.xml配置文件中使用<mvc:annotation-driven>替代注解处理器和适配器的配置。
6、RequestMapping注解
/**
作用:用于建立请求URL和处理请求方法之间的对应关系
属性:
value:用于指定请求的URL。它和path属性的作用是一样的
method:用于指定请求的方式
params:用于指定限制请求参数的条件。它支持简单的表达式。要求请求参数的key和value必须和配置的一模一样
例如:params={"username=王大妈"} 则 url中必须有 ?username=王大妈 并且username和王大妈必须一模一样
header:发送的请求当中,必须包含的请求头。
注意:value和method非常常用,params和header并不常用
*/
示例:
@RequestMapping(value = "/testRequestMapping",params = {"username=王大妈"},headers = {"Accept"})
public String testRequestMapping(){
System.out.println("测试RequestMapping注解。。。。");
return "success";
}
四、参数的绑定
1、请求参数的绑定入门 (基本类型和String类型的参数绑定)
----------------------------------Java代码----------------------------------
@RequestMapping("/testParam")
public String testParam(String username,String password){
System.out.println("执行了....");
System.out.println("你的用户名:"+username);
System.out.println("你的密码:"+password);
return "success";
}
----------------------------------JSP代码----------------------------------
<%-- 请求参数绑定 --%>
<a href="/springmvc_start/param/testParam?username=hehe&password=root">请求参数绑定</a>
2、请求参数绑定,把数据封装到JavaBean的Account类中
注意:
1、name的赋值:必须和JavaBean类的变量名一致,否则无法绑定参数
2、当JavaBean类中有引用对象User时,通过user.uname进行赋值
----------------------------------Java代码----------------------------------
@RequestMapping("/saveAccount")
public String saveAccount(Account account){
System.out.println("执行了....");
System.out.println(account);
return "success";
}
----------------------------------JSP代码----------------------------------
<form action="param/saveAccount" method="post">
姓名:<input type="text" name="username"/> <br>
密码:<input type="text" name="password"/> <br>
金额:<input type="text" name="money"/> <br>
用户姓名:<input type="text" name="user.uname"/> <br>
用户年龄:<input type="text" name="user.age"/> <br>
<input type="submit" value="提交"/> <br>
</form>
3、将数据封装到Account类中,类中存在list和map的集合
----------------------------------JSP代码----------------------------------
<form action="param/saveAccount" method="post">
姓名:<input type="text" name="username"/> <br>
密码:<input type="text" name="password"/> <br>
金额:<input type="text" name="money"/> <br>
<%-- list集合的参数绑定 --%>
用户姓名:<input type="text" name="list[0].uname"/> <br>
用户年龄:<input type="text" name="list[0].age"/> <br>
<%-- map集合的参数绑定 --%>
用户姓名:<input type="text" name="map['one'].uname"/> <br>
用户年龄:<input type="text" name="map['one'].age"/> <br>
<input type="submit" value="提交"/> <br>
</form>
----------------------------------Java代码----------------------------------
@RequestMapping("/saveAccount")
public String saveAccount(Account account){
System.out.println("执行了....");
System.out.println(account);
return "success";
}
4、获取Servlet原生的API
获取方式:直接在方法的参数列表获取,获取后可直接使用
@RequestMapping("/testServlet")
public String testServlet(HttpServletRequest request, HttpServletResponse response){
System.out.println("执行了....");
System.out.println(request);
HttpSession session = request.getSession();
System.out.println(session);
ServletContext servletContext = session.getServletContext();
System.out.println(servletContext);
return "success";
}
五、配置解决中文乱码的过滤器
----------------------------------web.xml中配置----------------------------------
<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>
六、自定义类型转换器
----------------------------------类型转换工具类----------------------------------
/**
* 字符串转换成日期类型
* @author Vagaband
* @date 2020/5/24 15:33
*/
public class StringToDateConverter implements Converter<String, Date> {
/**
* String source 传入进来的字符串
* @param source
* @return
*/
@Override
public Date convert(String source) {
// 判断
if (source == null) {
throw new RuntimeException("请您传入数据!");
}
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
try {
// 把字符串转换日期
Date parse = df.parse(source);
return parse;
} catch (Exception e) {
throw new RuntimeException("数据类型转换出现错误");
}
}
}
----------------------------------springMVC.xml代码----------------------------------
<!--配置自定义类型转换器-->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="cn.itcast.utils.StringToDateConverter"></bean>
</set>
</property>
</bean>
* 重点:最后一定要在annotation-driver 后面将配置写入,否则配置不会自动注入。
<!--开启SpringMVC框架注解的支持-->
<mvc:annotation-driven conversion-service="conversionService"/>
七、常用注解
1、常用注解:@RequestParam
/**
* 常用注解1:@RequestParam
* 作用:把请求中指定名称的参数给控制器中的形参赋值。(通俗讲就是指定URL的传参名)
* 如果指定则必须URL请求体中的请求参数名必须和指定的一样否则报错404。
* 属性:
* value:请求参数中的名称
* required:请求从参数中是否必须提供此参数。默认值:true;表示必须提供,如果不提供则报错。
* @param username
* @return
*/
@RequestMapping("/testRequestParam")
public String testRequestParam(@RequestParam(name = "name") String username){
System.out.println("执行了");
System.out.println(username);
return "success";
}
2、常用注解:@RequestParam
/**
* 常用注解2:@RequestParam
* 作用:用于获取请求体内容。直接使用得到是key=value&key=value...结构的数据
* get请求方式不适用。
* 属性:
* required是否必须有请求体。默认值是:true。当取值为true时,get请求方式会报错。如果取值为false,get请求达到null。
* @param body
* @return
*/
@RequestMapping("/testRequestBody")
public String testRequestBody(@RequestBody String body){
System.out.println("执行了");
System.out.println(body);
return "success";
}
3、常用注解:@RequestBody
-----------------获取请求体:直接拿到所有请求参数-----------------
@RequestMapping("/testRequestBody")
public String testRequestBody(@RequestBody String body){
System.out.println("执行了");
System.out.println(body);
return "success";
}
4、常用注解:@PathVariable
/**
* 常用注解4:PathVariable
* 作用:用于绑定url中的占位符。例如:请求url中/delete/{id},这个{id}就是url占位符
* url支持占位符是spring3.0之后加入的。是springmvc支持rest风格URL的一个重要标志。
* 属性:
* value:用于指定url中占位符名称。
* required:是否必须提供占位符。
* restful编程风格:
* 通过请求方式和{参数}来指定方法,。
*/
@RequestMapping("/testPathVariable/{sid}")
public String testPathVariable(@PathVariable(name = "sid") String id){
System.out.println("执行了");
System.out.println(id);
return "success";
}
--------------------URL中直接传入参数值就能获取到-------------------------
<a href="/springmvc_start/anno/testPathVariable/10">PathVariable</a>
5、不常用注解:@RequestHeader
/**
* 不常用注解:@RequestHeader
* 作用:获取请求头的值
* 属性:
* value:提供消息头的名称
* required:是否必须有此消息头
* 注:实际开发中不常用
* @param header
* @return
*/
@RequestMapping("/testRequestHeader")
public String testRequestHeader(@RequestHeader(value = "Accept") String header){
System.out.println("执行了");
System.out.println(header);
return "success";
}
6、常用注解:@CookieValue
/**
* 常用注解:@CookieValue
* 作用:用于指定cookie名称的值传入控制器方法参数
* 属性:
* value:指定cookie的名称
* required:是否必须有此cookie
* 注:实际开发中不常用
* @param cookieValue
* @return
*/
@RequestMapping("/testCookieValue")
public String testCookieValue(@CookieValue("JSESSIONID") String cookieValue){
System.out.println("执行了");
System.out.println(cookieValue);
return "success";
}
7、常用注解:@ModelAttribute
/**
* 常用注解:@ModelAttribute
* 作用:可以用于修饰方法和参数
* 出现在方法上:表示当前方法会在控制器的方法执行之前,先执行。它可以修饰没有返回值的方法,也可以修饰有具体返回值的方法
* 出现在参数上:获取指定的数据给参数赋值。
* 属性:
* value:用于获取数据的key。key可以使POJO的属性名称,也可以是map结构域的key。
* 应用场景: 当表单提交数据不是完整的实体类数据时,保证没有提交数据的字段使用数据库对象原来的数据。
* 例如: 我们在编辑一个用户时,用户有一个创建信息字段,该字段的值是不允许被修改的。
* 在提交表单数据是肯定没有此字段的内容,一旦更新会把该字段内容置为null,此时就可以使用此注解解决问题。
* 两种使用方法:
* 1.当有返回值时:
* 通过返回值传递赋上为空的值。
* 2.当无返回值时:
* 存储:通过参数中定义的Map集合,使用map集合的put方法存储,Map的键用来取出,值用来存数据。
* 取出:通过在绑定参数的参数列表前添加@ModelAttribute("abc"),取出参数。
*/
/*有返回值的情况,表单提交少提交参数,通过showUser查询数据库参数进行提交。*/
@RequestMapping("/testModelAttribute")
public String testModelAttribute(User user){
System.out.println("testModelAttribute执行了");
System.out.println(user);
return "success";
}
@ModelAttribute
public User showUser(String uname){
System.out.println("showUser方法执行了....");
// 通过用户查询数据库 (模拟)
User user = new User();
user.setUname(uname);
user.setAge(20);
user.setDate(new Date());
return user;
}
-------------------------无返回值的情况-------------------------
@RequestMapping("/testModelAttribute")
public String testModelAttribute(@ModelAttribute("abc") User user){
System.out.println("testModelAttribute执行了");
System.out.println(user);
return "success";
}
@ModelAttribute
public void showUser(String uname, Map<String,User> map){
System.out.println("showUser方法执行了....");
// 通过用户查询数据库 (模拟)
User user = new User();
user.setUname(uname);
user.setAge(20);
user.setDate(new Date());
map.put("abc",user);
}
8、常用注解:@SessionAttribute
/**
* 常用注解:@SessionAttribute
* 作用:用于多次执行控制器方法间的参数共享。
* 属性:
* value:用于指定存入的属性名称。
* type:用于指定存入的数据类型。
* @return
*/
@RequestMapping("/testSessionAttributes")
public String testSessionAttributes(Model model){
System.out.println("testSessionAttributes....");
// 底层会存储到request域当中
model.addAttribute("msg","花木兰");
return "success";
}
/**
* 获取Session中的值
* @param model
* @return
*/
@RequestMapping("/getSessionAttributes")
public String getSessionAttributes(ModelMap model){
System.out.println("getSessionAttributes....");
String msg = (String) model.get("msg");
System.out.println(msg);
return "success";
}
/**
* 删除Session中的值
* @param status
* @return
*/
@RequestMapping("/delSessionAttributes")
public String delSessionAttributes(SessionStatus status){
System.out.println("getSessionAttributes....");
status.setComplete();
return "success";
}
更多推荐
所有评论(0)