1, springMVC使用过程
1),新建maven工程,连接好Tomcat(选中工程,右键最后一项),导入spring-webmvc包(pom.xml文件中加入此包的关联),拷贝spring-mvc.xml(此文件用来配置组件扫描、注解扫描、视图解析器等)文件到资源路径(src/main/resources),
配置web.xml文件:此文件用于连接配置DispatcherServlet,此文件中有与spring-mvc.xml文件相关联的内容。
2),写视图部分,写一个.jsp文件,里面有放在网页上显示的内容,此内容供用户观看和使用,当用户触发之后,网页上会将请求传给控制器,最近使用的是表单的提交,action的值决定了提交到的位置。
3),控制器中通过组件扫描,找到的@Controller之后定位相应的@RequestMapping(“请求action值”)下面的方法,执行方法中的语句(绑定属性值),然后return返回要显示的jsp文件名同时带过去绑定的值。在下一个jsp中显示内容!
2,SpringMVC中接收网页上的请求几种方式(以下是在
Controller类中)
1),方法中传入HttpServletRequest request,使用request的getParameter方法获取单个的 name值
2),在声明形参前面使用@RequestParam(“请求参数名”)注解,此时使用形参就相当于操作请求参数
3),新建一个bean,此类中必须满足三条规定!
-1,属性名要与请求参数名一样
-2,属性类型要与请求参数值一致
-3,提供相应的get/set方法
此时在控制器方法中传入这个bean对象,就可以使用get方法获得相应的值。
3, 设置属性值
a) 如果使用的是传入HttpServletReqeust 那就等运算之后直接将结果 以 reqtuest . setAttribute(“名”,值) 的方式设置属性值就可以了,然后return “视图名” 。
b) 如果传入的是 ModelMap 使用方式与HttpServeltRequest类似,只是在设置属性值的时候使用的是 mm . addAttribute(“名”,值)。
c) 如果方法的声明使用的返回值类型是 ModelAndView 那就有点麻烦了,首先在方法声明的时候, public String bmi( ){ }不能用String 而要改用ModelAndView,并且要new一个Map,将参数put进去(data . put(“名”,值)),接着还要new一个ModelAndView对象,将返回的视图名和Map分别传进去(ModelAndView nav= new ModelAndView(“视图名”,data);),最后return的是 nav。
写了这么多干货,来个蛋花汤--------> 小案例全部代码奉上
0,第一步的配置环境代码
0.1,pro.xml文件内容
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.tedu.string</groupId>
<artifactId>day04-spring-test</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.1.0.RELEASE</version>
</dependency>
</dependencies>
</project>
0.2,spring-mvc.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:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd">
<!-- 组件扫描 扫描让@Controller -->
<context:component-scan base-package="controller"></context:component-scan>
<!-- 配置MVC注解扫描,让@RequestMapping注解 启动 -->
<mvc:annotation-driven/>
<!-- 配置viewresolver(视图解析器) -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
0.2,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_2_5.xsd" version="2.5">
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
1,显示视图(共两个案例,一个是计算bmi指数,一个是登录判断)
1.1,计算bmi值的代码
<%@ 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=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<form action="bmi_3.do" method="post">
<fieldset>
<legend>计算bmi身体指数</legend>
身高:<input name="height">
体重:<input name="weight">
<input type="submit" value="提交测试">
</fieldset>
</form>
</body>
</html>
1.2,用户注册页面代码
<%@ page contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<html>
<head>
</head>
<body style="font-size:30px;">
<form action="login_5.do" method="post">
<fieldset>
<legend>用户注册登录界面</legend>
用户名:<input name="uname"><br>
密码:<input name="pwd" type="password"><br>
<input type="submit" value="登录">
</fieldset>
</form>
</body>
</html>
2,Controller
package controller;
/*
* 加注解
*/
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
/**
* Controller对象
*
*
*/
@Controller
public class hello {
@RequestMapping("toBmi.do")
public String toBmi(){
System.out.println("toBmi()这个方法");
return "login";
//这里如果返回的事bmi,那么就会跳到 bmi.jsp,计算bmi指数的页面
//这里如果返回的是 login,那么就会跳到 login.jsp,登录的页面
}
/**
* dispatcherServlet在调用处理器(controller)的方法前,会利用java
* 反射机制分析方法的结构(比如分析方法的参数类型)然后进行相应的处理,(比如,在这儿,发现bmi方法有一个参数类型为
* HttpServletReqeust,则将该对象作为参数传递进来
* )
*/
@RequestMapping("bmi_1.do")
public String bmi(HttpServletRequest request){ //可以在这里传入request
String weight = request.getParameter("weight");
String height = request.getParameter("height");
System.out.println("身高和体重分别是:"+height+":"+weight);
System.out.println("bmi()获取网页上的宽和高");
// String status = "体重正常";
// Double bmi=Double.parseDouble(weight)/Double.parseDouble(height)/Double.parseDouble(height);
// if(bmi<19){
// status="多吃点,太瘦了!";
// }
// if(bmi>25){
// status="该减肥了!";
// }
// request.setAttribute("status", status);
return "view";
}
@RequestMapping("bmi_2.do")
public String bmi1(HttpServletRequest request,BmiParam bm){ //可以用一个封装类获取值,但是属性名称与请求参数必须一致
Double height=Double.parseDouble(bm.getHeight());
Double weight=Double.parseDouble(bm.getWeight());
Double bmi=weight/height/height;
String status = "体重正常";
if(bmi<19){
status="多吃点,太瘦了!";
}
if(bmi>25){
status="该减肥了!";
}
request.setAttribute("status", status);
return "view";
}
/*
* request.getParameter("height")与@RequestParam("height")一样的原理
* 都是获取请求参数的值
*/
@RequestMapping("bmi_3.do")
public String bmi2(
@RequestParam("height") String h,
@RequestParam("weight") String w,HttpServletRequest request
){ //可以直接在这里使用与请求参数名相同的形式参数,两者会自动关联,但是如果名字不同,就要使用【@RequestParam("请求参数名") String 形式参数名】的方法来获取请求参数的值
System.out.println(h+":"+w);
Double height=Double.parseDouble(h);
Double weight=Double.parseDouble(w);
Double bmi=weight/height/height;
String status = "体重正常";
if(bmi<19){
status="多吃点,太瘦了!";
}
if(bmi>25){
status="该减肥了!";
}
request.setAttribute("status", status);
return "view";
}
/*
* 使用方式一,在方法的声明的时候传入 HttpServletRequest ,然后绑定到请求上
*/
@RequestMapping("login_1.do")
public String login1(HttpServletRequest request){
String name=request.getParameter("uname");
String pwd = request.getParameter("pwd");
String status = "请登录";
if("caott".equals(name)&&"488".equals(pwd)){
status = "caott成功";
}else{
status="caott失败";
}
request.setAttribute("status", status);
return "view";
}
/*
* 使用方式二,在方法中直接传入 和请求参数一致的 形式参数,并且传入HttpServletR equest
*/
@RequestMapping("login_2.do")
public String login2(String uname,String pwd,HttpServletRequest request){
String status = "请登录";
if("caott".equals(uname)&&"488".equals(pwd)){
status = "caott成功";
}else{
status="caott失败";
}
request.setAttribute("status", status);
return "view";
}
/*
* 使用方式三,创建一个类封装请求参数
*/
@RequestMapping("/login_3.do")
public String login2(LoginParam lg,HttpServletRequest request){
String un = lg.getUname();
String pwd=lg.getPwd();
String status = "请登录";
if("caott".equals(un)&&"488".equals(pwd)){
status = "caott成功";
}else{
status="caott失败";
}
request.setAttribute("status", status);
return "view";
}
/**
* 使用方式4,在创键封装类的同时使用 Map,和 ModelAndView
* ModelAndView 相当于一种引用类型,这种类型和其他类型声明一样
* 但是这种类型的使用要传入Map值,所以,在这个方法里面新建了一个map,以键值对的形式存入map中
* map要用put方法传入值
*/
@RequestMapping("/login_4.do")
public ModelAndView login3(LoginParam lg){
String un = lg.getUname();
String pwd=lg.getPwd();
String status = "请登录";
if("caott".equals(un)&&"488".equals(pwd)){
status = "caott成功";
}else{
status="caott失败";
}
Map<String,Object> data = new HashMap<String,Object>();
data.put("status", status);
ModelAndView nav = new ModelAndView("view",data);
System.out.println("ModelAndView方法");
return nav;
}
/*
* 使用方式5,这种方式是传入ModelMap和构造参数
* 要用 .addAttribute("",值)的方式传入到ModeMap中
*/
@RequestMapping("/login_5.do")
public String login4 (LoginParam lp,ModelMap mm){
String un = lp.getUname();
String pwd = lp.getPwd();
String status;
if("caott".equals(un)&&"488".equals(pwd)){
status = "caott成功";
}else{
status="登录失败";
}
mm.addAttribute("status",status);
System.out.println("这是login_5.do的请求,使用了ModelMap");
return "view";
}
}
3,两个bean
3.1,计算bmi值得Bean
package controller;
/**
* 用于封装请求参数,要求:
* 1,属性名要与请求参数名一样
* 2,属性类型要与请求参数值一致
* 3,提供相应的get/set方法
* @author
*/
public class BmiParam {
private String weight;
private String height;
public String getWeight() {
return weight;
}
public void setWeight(String weight) {
this.weight = weight;
}
public String getHeight() {
return height;
}
public void setHeight(String height) {
this.height = height;
}
}
3.2,注册登录的Bean
package controller;
/**
* 这是login的构造方法,用于封装请求参数
* 1,属性名要与请求名相同
* 2,要有get/set方法、
* 3,属性类型要与请求类型一致
* @author
*
*/
public class LoginParam {
private String uname;
private String pwd;
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
}
特此说明:跟任何盈利性机构无任何关系,纯属个人娱乐笔记整理,希望也能帮助到小白
至此,晚安!