1、搭建环境
2、如何完成Controller和Viewer的映照
3、如何把值传递给Controller
6、页面标签
7、文件上传
8、深入1下源代码
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 如果不配置这个,那末 就必须在/WEB-IN/下创建文件名为springmvc-servlet的.xml文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<!-- 在src目录下或自己创建的"Source Floder"目录下新建springmvc.xml -->
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<?xml version="1.0" encoding="UTF⑻"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans⑶.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop⑶.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context⑶.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc⑶.0.xsd">
</beans>
<!-- 非注解方式 -->
<bean name="/welcome.html" class="com.wen.controller.WelcomeController"></bean>
<!-- 配置视图解析器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
WellcomeController.java代码以下:
public class WelcomeController extends AbstractController {
@Override
protected ModelAndView handleRequestInternal(HttpServletRequest req,
HttpServletResponse resp) throws Exception {
System.out.println("Welcome");
ModelAndView mav = new ModelAndView();
//则返回的视图为/WEB-INF/jsp/welcome.jsp
mav.setViewName("welcome");
//在wellcome.jsp中可使用${msg}获得'welcome to spring MVC'
mav.addObject("msg", "welcome to spring MVC");
return mav;
}
}
上面这类非注解方式来映照视图的方式几近不会使用
springmvc.xml的配置以下:
<!-- 使用注解方式 -->
<!-- 打开注解 -->
<mvc:annotation-driven/>
<!-- 扫描包 -->
<context:component-scan base-package="com.wen.controller"/>
<!-- 配置视图解析器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
HelloController.java代码以下:
//@RequestMapping表示用哪一个url来对应
@RequestMapping(value={"/hello","/"})
//@RequestParam注解参数
//如http://xxx/hello?username=zhangsan
//使用Map<String, Object> context来将数据传递到hello.jsp页面
public String hello(@RequestParam(value="username",required=false)String name, Map<String, Object> context){
System.out.println("hello " + name);
context.put("username", name);
return "hello";
}
但更建议使用Model来传递数据,代码以下
@RequestMapping(value="welcome")
public String welcome(String username,Model model){
//使用model.addAttribute来传递数据
//如http://xxx/welcome?username=zhangsan
model.addAttribute("msg", "welcome to spring MVC");
model.addAttribute("name", username);
return "welcome";
}
REST的风格不等于使用了REST技术
user为路径,120为user_id
查询用户:user/120———————查询id=120的用户
删除用户:user/120/delete————删除id=120的用户
更新用户:user/120/update———–更新id=120的用户信息
1些技能
当jsp页面中需要使用标签库时(如:需要使用< c:forEach>)
1.首先需要导入jstl⑴.x.jar包
2.需要在jsp页面中加入以下代码:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
3.同时,需要在springmvc.xml的视图解析器配置中加入以下代码:
<!-- 当要使用taglib标签库是,需要配置这个属性。但spring3.0.5以后默许会加上这个属性 -->
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
如果要使用验证,则需要导入下面这个包
JSR303使用帮助
用法举例:
在User.java中的get方法上面使用验证注解
在Controller方法中:
在add.jsp中:
结果以下:
public class User {
private String username;
private String password;
private String nickname;
private String email;
//默许构造函数
public User(){
}
public User(String username, String password, String nickname, String email) {
super();
this.username = username;
this.password = password;
this.nickname = nickname;
this.email = email;
}
//省略setter和getter方法
<%@ page language="java" import="java.util.*" pageEncoding="UTF⑻"%>
<%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF⑻">
<title>添加用户</title>
</head>
<body>
<!-- modelAttribute="user",会自动将表单中的值添加到User中 -->
<!-- 此时没有写action,直接提交给/add,但此时是POST方式提交,会 使用method=RequestMethod.POST注解的方法-->
<sf:form method="post" modelAttribute="user">
<!-- path相当于input中的name属性 -->
Username:<sf:input path="username"/><br>
Password:<sf:password path="password"/><br>
Nickname:<sf:input path="nickname"/><br>
Email:<sf:input path="email"/><br>
<input type="submit" value="添加用户"/>
</sf:form>
</body>
</html>
@Controller
@RequestMapping("/user")
public class UserController {
private Map<String, User> users = new HashMap<String, User>();
//默许构造函数
public UserController(){
users.put("zs", new User("zs", "123", "张3", "123@163.com"));
users.put("ls", new User("ls", "123", "李4", "234@163.com"));
users.put("we", new User("we", "123", "王5", "345@163.com"));
users.put("sj", new User("sj", "123", "世杰", "456@163.com"));
users.put("yp", new User("yp", "123", "1平", "567@163.com"));
users.put("ww", new User("ww", "123", "微微", "678@163.com"));
}
@RequestMapping(value="/users", method=RequestMethod.GET)
public String list(Model model){
model.addAttribute("users", users);
return "user/list";
}
//连接到add页面时是GET要求,会访问这段代码
@RequestMapping(value="/add", method=RequestMethod.GET)
public String add(Model model){
//必须添加1个User,不然在add.jsp中
//modelAttribute="user"的user没法获得
model.addAttribute(new User());
//服务器端跳转:自动加上"forward:"
return "user/add";
}
//除上面1种方式,我更喜欢下面这类
//@RequestMapping(value="/add", method=RequestMethod.GET)
//public String add(@ModelAttribute("user") User user){
// return "user/add";
//}
//在具体添加用户时,是POST要求,会访问这段代码
@RequestMapping(value="/add", method=RequestMethod.POST)
public String add(User user){
users.put(user.getUsername(), user);
//客户端跳转:使用"redirect:"
return "redirect:/user/users";
}
}
由于在页面中使用了中文,需要在web.xml中添加字符编码过滤器
<!-- 编码过滤器 -->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF⑻</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
2016⑼⑵0 23:28:32 未完待续
接续:
//显示某个用户的方法
//@PathVariable String username表示使用路径中的{username}来最为参数
@RequestMapping(value="/{username}", method=RequestMethod.GET)
public String show(@PathVariable String username, Model model){
//通过username取得User对象
//在show.jsp页面中通过${user}来获得对象
model.addAttribute(users.get(username));
return "user/show";
}
上面这类异常处理只能处理局部异常,不太好用,所以需要进行前期的异常处理,可以在springmvc.xml配置文件中来配置。
由于在web.xml中配置的DispatchServlet拦截的路径为”/”
所以静态文件也将被servlet拦截,从而没法获得
所以需要在在springmvc.xml中为静态文件进行配置,配置以下
在页面中引入静态文件:
显示结果以下:
*这里尽可能用最新的jar包,将我用的commons-io⑴.4换成commons-io⑵.x.jar版本
不然后面会有问题*
只是在控制台打印了上传文件的1些信息
现在我们来实现真实的上传文件
这个需要贴上代码:
//在具体添加用户时,是POST要求,会访问这段代码
@RequestMapping(value="/add", method=RequestMethod.POST)
public String add(@Valid User user,BindingResult br, @RequestParam("attach") MultipartFile attach,
HttpServletRequest req) throws IOException{//1定要紧跟Validate以后写验证结果类
if(br.hasErrors()){
//如果有毛病直接挑战到add视图中
return "user/add";
}
//取得"resources/upload"的实际路径
String realpath = req.getSession().getServletContext().getRealPath("/resources/upload");
System.out.println(realpath);
//取得文件要保存的路径和文件名
String pathname = realpath + "/" + attach.getOriginalFilename();
//创建文件
File f = new File(pathname);
FileUtils.copyInputStreamToFile(attach.getInputStream(), f);
System.out.println(attach.getName()+","+attach.getOriginalFilename()+","+attach.getContentType());
users.put(user.getUsername(), user);
//客户端跳转:使用"redirect:"
return "redirect:/user/users";
}
上传成功
上传成功
但是,这里有1个问题需要特别注意
怎样解决?很简单,看下面
好了,文件上传就讲到这里就应当差不多了吧,呵呵。
终究讲到这里了,真是要哭了,555555~~~
使用@RequestBody注解和jackson :
不使用它们: