java 静态类怎么使用SpringMVC的注解功能

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 静态类怎么使用SpringMVC的注解功能相关的知识,希望对你有一定的参考价值。

要写一个工具类,该类中是静态方法,要使用springMVC的@service去调用业务层。该怎么写啊?

1.方法一:在初始化时保存ApplicationContext对象
代码:
ApplicationContext ac = new FileSystemXmlApplicationContext("applicationContext.xml");
ac.getBean("beanId");
说明:这种方式适用于采用Spring框架的独立应用程序,需要程序通过配置文件手工初始化Spring的情况。
2.方法二:通过Spring提供的工具类获取ApplicationContext对象
代码:
import org.springframework.web.context.support.WebApplicationContextUtils;
ApplicationContext ac1 = WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext sc);
ApplicationContext ac2 = WebApplicationContextUtils.getWebApplicationContext(ServletContext sc);
ac1.getBean("beanId");
ac2.getBean("beanId");
说明:
这种方式适合于采用Spring框架的B/S系统,通过ServletContext对象获取ApplicationContext对象,然后在通过它获取需要的类实例。
上面两个工具方式的区别是,前者在获取失败时抛出异常,后者返回null。
其中 servletContext sc 可以具体 换成 servlet.getServletContext()或者 this.getServletContext() 或者 request.getSession().getServletContext(); 另外,由于spring是注入的对象放在ServletContext中的,所以可以直接在ServletContext取出 WebApplicationContext 对象: WebApplicationContext webApplicationContext = (WebApplicationContext) servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
3.方法三:继承自抽象类ApplicationObjectSupport
说明:抽象类ApplicationObjectSupport提供getApplicationContext()方法,可以方便的获取到ApplicationContext。
Spring初始化时,会通过该抽象类的setApplicationContext(ApplicationContext context)方法将ApplicationContext 对象注入。
4.方法四:继承自抽象类WebApplicationObjectSupport
说明:类似上面方法,调用getWebApplicationContext()获取WebApplicationContext
5.方法五:实现接口ApplicationContextAware
说明:实现该接口的setApplicationContext(ApplicationContext context)方法,并保存ApplicationContext 对象。
Spring初始化时,会通过该方法将ApplicationContext对象注入。
参考技术A 可利用JAVA的反射调用。 参考技术B 你可以先获得spring容器,WebApplicationContext,有了他,你就可以获得所有spring管理的bean,获得WebApplicationContext有多种办法,你可以再上网找下详细方法。追问

可以具体点吗?

追答

http://www.blogjava.net/Todd/archive/2010/04/22/295112.html
百度WebApplicationContext 有很多方法的

SpringMVC第三课 SpringMVC框架对Java注解使用

概念

本人对SpringMVC框架使用Java注解的方式进行讲解浏览器的访问流程。

环境搭建

创建Web项目,将所需要的jar包放置lib文件夹中,将springMVC.xml文件放置resources资源文件夹中,在web.xml文件中定义DispatcherServlet类,使浏览器访问服务器时,用于匹配所有访问该服务器项目的地址。代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <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:springMVC.xml</param-value>
        </init-param>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>SpringMVC</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:mvc="http://www.springframework.org/schema/mvc"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    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">
 <!--将创建的控制器注册在主配置文件中-->
  <!--<bean name="/oc" class="com.web.controller.OneController"></bean>-->

 <!--指定包的路径,
     在运行的时候根据指定的包进行扫描该包下的所有带有注解的类,
     并动态的加载至主配置文件-->
     <context:component-scan base-package="com.web.controller"></context:component-scan>

    <!--允许springmvc框架使用java注解-->
     <mvc:annotation-driven/>

     <!--创建观察者监听器,用于监听控制器中页面跳转-->
     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
          <property name="prefix" value="/WEB-INF/jsp/"></property>
          <property name="suffix" value=".jsp"></property>
     </bean>

 
 </beans>

在src文件夹中创建包com.web.controller,在包中创建OneController类,并使用@Controller注解定义该类的对象,@RequestMapping("/oc")注解用于定义浏览器访问的虚拟地址。在该类中定义方法,并设置子级虚拟地址,作为调用执行该方法的访问路径,其代码如下:

/**
 * 控制层的控制器
 * Spring框架中介绍过创建类的对象有以下四种方式
 * @Component:用于创建普通类的对象
 * @Repository:用于创建数据访问层的对象
 * @Service:用于创建业务逻辑层的对象
 * @Controller:用于创建控制层的对象
 * <!--将创建的控制器注册在主配置文件中-->
 * <!--<bean name="/oc" class="com.web.controller.OneController"></bean>-->
 */

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:用于创建控制层的对象
 * <!--将创建的控制器注册在主配置文件中-->
 * <!--<bean name="/oc" class="com.web.controller.OneController"></bean>-->
 */
@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" %>
<html>
<head>
    <title>页面一</title>
</head>
<body>
我是第一个jsp页面
</body>
</html>

启动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" %>
<html>
<head>
    <title>页面二</title>
</head>
<body>
我是第二个jsp页面 <br>
$name<br>
$age<br>
</body>
</html>

通过浏览器输入地址访问控制器进行获得数据,并将数据显示在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" %>
<html>
<head>
    <title>页面五</title>
</head>
<body>
    我是第五个jsp页面 <br>
$text<br>
获得小狗的信息为: <br>
    小狗名称:$d.name<br>
    小狗年龄:$d.age<br>
    小狗性别:$d.sex<br>
    小狗颜色:$d.color<br>

</body>
</html>

也可以保持返回值类型为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 "<a href='https://www.baidu.com'>百度一下</a>";
    

那么以上几种写法,在后期的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的学习有一个新的认识。

学习在于坚持,相信目标终会实现!!!

以上是关于java 静态类怎么使用SpringMVC的注解功能的主要内容,如果未能解决你的问题,请参考以下文章

springmvc enablewebmvc注解作用

SpringMVC第三课 SpringMVC框架对Java注解使用

springMVC 怎么在方法中注入HttpServletResponse对象

spring boot整合security 4,怎么设置忽略的静态资源?

Spring功能介绍SpringMVC集成Java Bean Validation实现参数检验功

spring 注解是有啥作用