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>
如简单的演示
数据库层 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;}