本人对SpringMVC框架使用Java注解的方式进行讲解浏览器的访问流程。
创建Web项目,将所需要的jar包放置lib文件夹中,将springMVC.xml文件放置resources资源文件夹中,在web.xml文件中定义DispatcherServlet类,使浏览器访问服务器时,用于匹配所有访问该服务器项目的地址。代码如下:
SpringMVC
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:springMVC.xml
SpringMVC
/
在springMVC.xml文件中定义如下代码:
在src文件夹中创建包com.web.controller,在包中创建OneController类,并使用@Controller注解定义该类的对象,@RequestMapping("/oc")注解用于定义浏览器访问的虚拟地址。在该类中定义方法,并设置子级虚拟地址,作为调用执行该方法的访问路径,其代码如下:
/**
* 控制层的控制器
* Spring框架中介绍过创建类的对象有以下四种方式
* @Component:用于创建普通类的对象
* @Repository:用于创建数据访问层的对象
* @Service:用于创建业务逻辑层的对象
* @Controller:用于创建控制层的对象
*
*
*/
package com.web.controller;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
/**
* 控制层的控制器
* Spring框架中介绍过创建类的对象有以下四种方式
* @Component:用于创建普通类的对象
* @Repository:用于创建数据访问层的对象
* @Service:用于创建业务逻辑层的对象
* @Controller:用于创建控制层的对象
*
*
*/
@Controller
@RequestMapping("/oc")
public class OneController {
@RequestMapping("/aaa")
public String one(){
//这里的返回,等价于request对象的请求转发
//等价于ModelAndView的页面跳转
return "one";
}
}
在WEB-INF文件夹中创建jsp文件夹,并在文件夹中新建one.jsp文件,其代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
页面一
我是第一个jsp页面
启动tomcat服务器,通过浏览器上输入匹配控制器中的访问虚拟地址进行跳转页面,例如:
http://localhost:8080/oc/aaa进行访问OneController类中的one方法,one方法收到springmvc.xml文件中的监听器的监听,进行给要跳转的one页面进行拼接前缀和后缀,组合成完成的访问路径,进行跳转页面,读者自行运行查看显示效果。
在OneController类中定义新的子级虚拟地址,供浏览器访问后,跳转至two.jsp页面。即当浏览器访问控制器时,如果携带了数据,那么控制器使用request对象接收浏览器的数据,并可以使用request携带数据跳转或者session对象存储数据等两种方式将数据显示在two.jsp页面中,其代码如下:
@RequestMapping("/bbb")
public String two(HttpServletRequest request){
//当浏览器访问服务器的时候,携带了数据,那服务器该怎么接收数据?
String name = request.getParameter("name");
String age = request.getParameter("age");
System.out.println(name+"--"+age);
//将姓名和年龄的数据显示在two.jsp页面上
//方法一:将数据存储在session中,因为session中的数据在不切换浏览器的情况下
//所有页面可以共享数据
//request.getSession().setAttribute("name",name);
//request.getSession().setAttribute("age",age);
//方式二
request.setAttribute("name",name);
request.setAttribute("age",age);
//request.getRequestDispatcher("two.jsp").forward(request,response);
//return的返回值就是以上request对象的请求转发的页面跳转
return "two";
}
在jsp文件夹中定义two.jsp文件,其代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
页面二
我是第二个jsp页面
${name}
${age}
通过浏览器输入地址访问控制器进行获得数据,并将数据显示在two.jsp页面中,输入的地址例如:
http://localhost:8080/oc/bbb?name=张三&age=20
springmvc框架中在@RequestMapping注解中定义了相关属性获得浏览器发送的数据,其代码如下:
//使用SpringMVC框架的方式接收浏览器传递的数据
//@RequestMapping:该注解用于设置虚拟地址,供浏览器访问
//value:该属性上填写的是虚拟地址
//params:该属性上填写接收浏览器发送过来的数据的参数名称
//method:该属性用于设置接收Get或者Post请求的请求方式
//当设置为Get请求,那么只能接收get请求
//当设置为post请求,那么只能接收post请求
//没有设置该属性,默认为get和post都能访问
//使用SpringMVC框架的方式接收浏览器传递的数据
//@RequestMapping:该注解用于设置虚拟地址,供浏览器访问
//value:该属性上填写的是虚拟地址
//params:该属性上填写接收浏览器发送过来的数据的参数名称
//method:该属性用于设置接收Get或者Post请求的请求方式
//当设置为Get请求,那么只能接收get请求
//当设置为post请求,那么只能接收post请求
//没有设置该属性,默认为get和post都能访问
@RequestMapping(value = "/ccc",params = {"name","age"},method = RequestMethod.GET)
public String three(String name, int age, Model model){
System.out.println(name+"@@"+age);
//springmvc框架中专门针对携带数据跳转页面提供专门的对象Model
//方式三
model.addAttribute("name",name);
model.addAttribute("age",age);
return "two";
}
读者自行运行查看运行访问效果。
springmvc框架中使用了不同方式获得浏览器的数据,例如@RequestParam,其代码如下:
//@RequestParam:该注解是springmvc框架中专门用于接收浏览器发送过来的数据
//该注解中设置的参数就是浏览器传输数据对应的参数名称
//@RequestParam:该注解是springmvc框架中专门用于接收浏览器发送过来的数据
//该注解中设置的参数就是浏览器传输数据对应的参数名称
@RequestMapping("/ddd")
public String four(@RequestParam("name")String a,
@RequestParam("age")int b,
HttpSession session,
HttpServletRequest request
){
System.out.println(a+"%%"+b);
//session.setAttribute("name",a);
//session.setAttribute("age",b);
//注意:ServletContext类不能作为形式参数定义在方法上
ServletContext application=request.getServletContext();
application.setAttribute("name",a);
application.setAttribute("age",b);
return "two";
}
其中也可以省略参数名称,当要求形式参数的变量名称与浏览器的数据参数名称需要要保持一致
//@RequestParam("name"):用于获得浏览器发送的数据,里面设置的名称必须要和浏览器的参数名称保持一致
//@RequestParam("name")String a,@RequestParam("age")int b
//@RequestParam该注解中的参数名称可以省略,
// 但前提是形式参数的变量名称需要和浏览器参数名称保持一致
@RequestMapping("/eee")
public String A5(@RequestParam String name,@RequestParam int age){
System.out.println(name+"-"+age);
return "two";
}
以上在浏览器访问过程中必须要携带控制器所指定的两个参数进行访问服务器,如果浏览器访问服务器的时候传一个参数或者不传参数或者传三个参数都会导致地址访问失败,必须要传递两个参数,那么在项目中,有时候浏览器传递的数据并不是那么完整,可能不传参数,那么怎么在这种情况中不会导致浏览器产生报错异常,@RequestParam注解中提供了用法,代码如下:
//required = false:该属性表示浏览器可以不用传该数据
//defaultValue该属性表示在浏览器没有发送数据过来的时候,默认启用该属性上设置的值
@RequestMapping("/fff")
public String A6(@RequestParam(value = "book",required = false,defaultValue = "不上课,休息")String book){
if (book==null){
System.out.println("浏览器没有发送数据过来");
}else {
System.out.println("浏览器发送数据过来了,为:"+book);
}
return "one";
}
在控制器中创建TwoController类,并通过注解的方式设定虚拟地址,在注解的方式中也是可以使用ModelAndView类进行携带数据跳转页面,其代码如下:
package com.web.controller;
import com.web.entity.Dog;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
@Controller
@RequestMapping("/tc")
public class TwoController {
@RequestMapping("/one")
public ModelAndView one(){
ModelAndView mav=new ModelAndView();
//在跳转页面之前,进行携带数据
mav.addObject("text","我是ModelAndView发送过来的数据");
//定义要跳转的页面的路径
mav.setViewName("five");
return mav;
}
}
在jsp文件中创建five.jsp页面,其代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
页面五
我是第五个jsp页面
${text}
获得小狗的信息为:
小狗名称:${d.name}
小狗年龄:${d.age}
小狗性别:${d.sex}
小狗颜色:${d.color}
也可以保持返回值类型为String类型,使用Model类进行存储要传输的数据,其代码如下:
@RequestMapping("/two")
public String two(Model model){
model.addAttribute("text","我是Model发送过来的数据");
Dog dog=new Dog("旺财",1,"男","棕色");
model.addAttribute("d",dog);
return "five";
}
需要用到的Dog类的代码如下:
package com.web.entity;
public class Dog {
private String name;
private int age;
private String sex;
private String color;
@Override
public String toString() {
return "Dog{" +
"name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
", color='" + color + '\'' +
'}';
}
public Dog() {
}
public Dog(String name, int age, String sex, String color) {
this.name = name;
this.age = age;
this.sex = sex;
this.color = color;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
}
那么在某种特殊情况下,我们并不需要跳转页面,而只是想将纯文本数据显示在浏览器上,那么该怎么操作?看一下代码:
//当浏览器访问该虚拟地址,不跳转页面,传html代码给浏览器
//@ResponseBody:控制器发给浏览器的数据不再是跳转页面,而是纯文本数据
@RequestMapping("/three")
@ResponseBody
public String three(){
return "my name is HanMeiMei";
}
@ResponseBody该注解用于固定其返回值的数据是文本内容,不需要监听器进行监听,并不是跳转至指定的html页面。
如果需要返回中文的纯文本,那么应该设置字符编码格式,并设置返回的是纯文本数据。
//当控制器传给浏览器的是纯文本格式需要设置produces属性
//text/plain:设置为纯文本
//charset=UTF-8:发给浏览器的文本数据转换成UTF-8编码格式
@RequestMapping(value = "/four",produces = {"text/plain;charset=UTF-8"})
@ResponseBody
public String four(){
return "我的名字叫韩妹妹";
}
如果返回的是具备html标签的html文本代码,其代码如下:
//返回给浏览器的是html文本格式
@RequestMapping(value = "/five",produces = {"text/html;charset=UTF-8"})
@ResponseBody
public String five(){
return "百度一下";
}
那么以上几种写法,在后期的SSM框架的综合使用中,使得前后端分离或者前后端伪分离时,springmvc框架中结合json解析,将前端需要的数据封装成json格式发送给前端的Ajax进行接收。
那么如何使用重定向方式改变访问的虚拟路径,也就是由其中一个控制器跳另一个控制器中,实现不同页面之间的连贯性跳转,或者是执行不同的功能代码,其操作如下:
//在springmvc框架中类似于重定向的更改访问的虚拟地址
@RequestMapping("/six")
public String six(){
System.out.println("我是控制器的第六个方法");
//相对路径:
// http://localhost:8080/tc/six 在该路径的访问下 redirect:one
//在同一个父路径下改变为http://localhost:8080/tc/one
return "redirect:one";
}
//在springmvc框架中类似于重定向的更改访问的虚拟地址
@RequestMapping("/seven")
public String seven(){
System.out.println("我是控制器的第七个方法");
//绝对路径:
// http://localhost:8080/tc/seven 在该路径的访问下 redirect:/oc/aaa
//在同一个父路径下改变为http://localhost:8080/oc/aaa
return "redirect:/oc/aaa";
}
通过本文的学习,读者应该很容易发现SpringMVC框架的注解的使用是非常灵活,易用,代码简洁,希望本文的学习可以让读者对SpringMVC的学习有一个新的认识。
学习在于坚持,相信目标终会实现!!!