JavaEE之--------SpringMVC框架的搭建(注解实现)

Spring这个强大的平台,可以放很多bean,当然像之前那样自己配置多个类确实麻烦

现在采用简单的注解实现

首先我们需要导入spring的包,带很多种


我们需要配置spring的配置文件

首先我们查看web.xml文件的配置

<span style="font-size:18px;"><?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
  <display-name></display-name>	
  
  <context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>
			classpath:beans.xml<!--加载处于classpath下面目录的xml文件,通过核心类ContextLoaderListener进行加载-->
		</param-value>
  </context-param>
  
  <filter>
    <filter-name>char</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  	<init-param><!-- spring框架中自带的字符编码解析其,就不用我们自己去写字符编码过滤器 --->
  	<param-name>encoding</param-name>
  	<param-value>UTF-8</param-value>
  	</init-param>
  </filter>
  <filter-mapping>
     <filter-name>char</filter-name>
     <servlet-name>hncu</servlet-name><!-- 拦截的路径是serlvet的name是hncu的 -->
  </filter-mapping>
  
  <listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  
  <servlet>
     <servlet-name>hncu</servlet-name>
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- 配置核心分配器 -->
  	<!-- 可以通过自己配置namespace来指定SpringMVC配置文件名 -->
  	<init-param>
  	  <param-name>namespace</param-name>
  	  <param-value>hncu-servlet</param-value><!--解决在项目启动的时候系统自动加载的servlet-name.xml文件的麻烦,可以自己进行配置-->
  	</init-param>
  </servlet>
  <servlet-mapping>
     <servlet-name>hncu</servlet-name>
     <url-pattern>/sp/*</url-pattern><!-- 拦截路径进去springmvc的范围 -->
  </servlet-mapping>
  
  
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app></span>

web.xml文件中一般只是配置spring的加载器,和拦截进去springmvc的路径。


beans.xml(spring的配置文件)

<span style="font-size:18px;"><?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:tx="http://www.springframework.org/schema/tx"
		xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
				http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
				http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
	
	<!--配置可以识别@RequestMapping注解的类  -->
	<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"></bean><!-- 配置默认的注解类 -->
	<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"><!-- 进行url地址映射,不配置这个的时候,当项目启动会需要一个name-servlet-->
    <!--xml文件这两个文件原本就是属于同一个空间的内容,要是不进行地址映射,程序是查找不到 -->
	</bean>

    <bean class="org.springframework.web.servlet.view.ResourceBundleViewResolver">  <!-- 当控制器请求之后,返回值的肯定会转到某个页面,就需要地址资源绑定 -->
       <property name="basenames">
         <list> <!--默认查询classpath:hncu.properties  -->
            <value>hncu</value> <!-- 指定资源配置文件名为hncu.properties -->
         </list>
       </property>
       <property name="defaultParentView" value="hncu"></property>  
    </bean>
    
    <!-- 配置一个用于文件上传的核心类     注意:id一定要配 
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" >
    </bean>
    -->
    <!-- 这是自动扫描的项目里面,下面配置的路径里面待有注解的类,进行自动扫描 -->
    <context:component-scan base-package="cn.hncu">
    </context:component-scan>
    
</beans></span>

资源绑定核心类的书写

<span style="font-size:18px;">hncu.(class)=org.springframework.web.servlet.view.JstlView
hncu.url=/jsps/hello.jsp</span>
这里面可以指定资源是某种类型,这里是jsp,和可以是xml,和pdf等文件


基本的配置就搞定了; 

现在需要是前台请求后台,就不需要写serlvet 

前台代码

  <span style="font-size:18px;"><hr/>
    <h2>学生信息输入</h2>
    <form action='<c:url value="/sp/saveStud"></c:url>' method="post">
       <input type="text" name="name" /><br/>
       <input type="text" name="age" /><br/>
       <input type="text" name="addr.city" /><br/>
       <input type="submit">
    </form></span>

  我们能看到在上面的urll地址请求中,直接请求的是 /sp/savaStud,sp是进入springmvc,后面的路径就只需要我们在类的方法上面添加注解就可以搞定了。

<span style="font-size:18px;">@Controller
public class StudController {
	@Resource(name="studService") //注入
	private IStudService service;
	
	@RequestMapping(value="/saveStud",params={"name"})
	public String save(User user){
    	service.save(user);
		return "hncu";
    }
}</span>
这个简单的代码就是能够让前台访问到这里 

注意:必须配置之前的配置文件 

请求的类里面必须在类前面添加@controller注解,在相应的方法时,添加@RequestMapping(value="/savaStud");这就能请求这个函数了,当我们需要什么参数的,只需要在函数的添加即可,如 需要 request和response对象,serlvet里面的对象,这里的就可以直接添加。

还可以要求必须传什么值进来,和不准传什么值进来等等,在参数里都可以进行。

下面是代码的演示:

<span style="font-size:18px;">@Controller //声明这是采用注解的类  
//@RequestMapping(value="/aa")   //这里声明就是为下面路径的父页面,则下面的访问路径的前面都必须带这个如访问  m1就是  项目名/sp/aa/aa
public class MyControllerAnno implements ServletContextAware{
		
	@RequestMapping(value="/aa") //当这样标明之后,我们采用项目名+/拦截路径名/aa就可以访问  用于影射路径的---由这里的value值决定访问地址
	public String m1(){
		System.out.println("进来了");
		return "xyz";
	}
		

	//可以随意添加 Servlet API类的参数类型作为入参
	@RequestMapping(value="/m2") 
	public String m2(@RequestParam("nm")String name,HttpServletRequest req,
			Integer age){
		System.out.println("name:"+name+",age:"+age);
		System.out.println("name2:"+req.getParameter("nm"));
		return "hncu";
	}
	
	//http://localhost:8080/springmvc2/sp/m3/aa/22  这种访问方式需要直接访问
	@RequestMapping(value="/m3/{na}/{ag}") 
	public String m3(@PathVariable("na")String name,@PathVariable("ag")Integer age){
		System.out.println("name:"+name+",age:"+age);//aa , 22
		return "hncu";
	}
	
	//http://localhost:8080/springmvc2/sp/m4
	//@RequestMapping(value="/m4",params={"nm","age!=100"}) //访问时必须带参数nm但age!=100
	//@RequestMapping(value="/m4",params={"nm","!age"}) //访问时必须带参数nm但不能带age
	//@RequestMapping(value="/m4",params={"nm","age"}) //访问时必须还nm和age两个参数
	@RequestMapping(value="/m4",params={"nm","age"},headers={"referer=http://localhost:8080/springmvc2/","content-type=application/*"}) //防盗链和限制必须是form或ajax提交
	public String m4(){
		System.out.println("name.....");
		return "hncu";
	}
	
	//级联的值对象数据也能封装
	//http://localhost:8080/springmvc2/sp/m5?name=Jack&age=24&addr.city=SZ
	@RequestMapping(value="/m5") 
	public String m5(User user){
		System.out.println("user:"+user);
		return "hncu";
	}
	
	//同时从请求路径中接收参数和从表单中接收参数,读取方式在下面有例子
	@RequestMapping(value="/m6/{nm}") 
	public ModelAndView m6(@PathVariable("nm") String name, @RequestParam("age") Integer age,@RequestParam("addr") String addr){
		System.out.println("name:"+name+",age:"+age);
		System.out.println("addr:"+addr);
		ModelAndView mv = new ModelAndView();
		mv.setViewName("hncu");
		mv.addObject("name", name);
		mv.addObject("addr", addr);
		return mv;
	}
	
	//绑定其他数据 ,如http协议的相应头//测试地址:http://localhost:8080/springmvc2/sp/m7?name=JJJJJ&addr.city=BJ
	@RequestMapping(value="/m7") 
	public String m6(HttpSession s, 
			@RequestHeader("accept")String accept,
			@CookieValue("JSESSIONID") String sessionId , User user){
		System.out.println("JSESSIONID1:"+s.getId());
		System.out.println("JSESSIONID2:"+sessionId);
		System.out.println("accept:"+accept);
		System.out.println("user:"+user);
		return "hncu";
	}
	
	//绑定到数组、集合等类型的请求参数(入参)上
	@RequestMapping(value="/m8",method={RequestMethod.PUT,RequestMethod.POST})//限定请求方式只能:PUT或POST 
	public String m8(@RequestParam("h") String[] hobies,
			@RequestParam("ss") List<String> ss ){
		System.out.println(Arrays.toString(hobies));
		System.out.println("List:"+ss);
		return "hncu";
	}
	
	//演示文件的下载
	@RequestMapping(value="/m9")
	public void m9(OutputStream out,HttpSession session,HttpServletResponse resp) throws Exception{
		String filename=session.getServletContext().getRealPath("/upfile/中文.jsp");
		resp.setContentType("application/force-download");//文件下载必须要设置相应头
		resp.setHeader("Content-Disposition", "attachment;filename=中文.jsp");
		InputStream in =new  FileInputStream(filename);
		Streams.copy(in, out, true);
	}
	
//	演示文件上传(用SpringMVC中提供的组件来实现)---多文件    MultipartFile<---FileItem
	@RequestMapping(value="/m10")
	public String m10(@RequestParam(value="nm")List<MultipartFile> files) throws Exception, IOException{
		//根据这里可以可以去name为nm的值,所以,我们可以在前台动态的添加文件选择框,供用户使用
		String path=sc.getRealPath("/upfile");
		System.out.println(path);
		System.out.println("长度"+files.size());
		for(MultipartFile file:files){
			Streams.copy(file.getInputStream(), new FileOutputStream(path+"/"+file.getOriginalFilename()), true);
		}
		return "hncu";
	}

	private ServletContext sc; //需要实现ServletConextAware 
	@Override
	public void setServletContext(ServletContext arg0) {
		this.sc=arg0;
	}</span>


这些就是能实现了,但是在我们的架构层中就不行了,我们需要配置注解就能搞定了,就不用像之前那种采用spring的依赖注入了。

如简单的演示 

数据库层  dao

只需要添加@Repository(value="dao") 就可以了

<span style="font-size:18px;">@Repository(value="dao")
public class AaDao{
   
}</span>

  逻辑层 Service

以前的service需要注入dao,现在直接注解搞定

@Service(value="service")
public class StudService {
	@Resource(name="dao")	
	private IStudDao dao;//直接就可以这样用了
 

同样的 controller中也是需要这样的

@Controller
public class StudController {
	@Resource(name="service")
	private IStudService service;}


基本上springmvc+spring直接访问数据库就可以架构起来了。
发布了107 篇原创文章 · 获赞 30 · 访问量 33万+

猜你喜欢

转载自blog.csdn.net/yangxin_blog/article/details/50737653