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直接访问数据库就可以架构起来了。