SpringMVC编程<三>
@Controller注解的应用演示
演示接参数:
所有要用的核心类和配置文件先都写好,因为昨天测试了2个配置文件,优先读默认的hncu-servlet.xml所以,今天以默认为例:(所有演示结果都是输出到控制台)
直接用超链接的形式调用函数,还是以’sp/’拦截
演示代码:
@Controller
public class DemoController implements ServletContextAware {
// 演示接受页面上传的参数
@RequestMapping(value = "/two")
// 变量名与前端提交的参数名一样
public String two(String name, Integer age) {
System.out.println(name + "," + age);
return "hncu";
}
// GET方式提交
@RequestMapping(value = "/three")
// 变量名与前端提交的参数名 如果不同
public String three(@RequestParam("name") String nm,
@RequestParam("age") Integer ag) {
// 参数加注解
System.out.println(nm + "," + ag);
return "hncu";
}
}
如果需要改变提交方式:
// POST
@RequestMapping(value = "/four", method = { RequestMethod.POST })
// 改变提交方式
public String four(@RequestParam("name") String nm,
@RequestParam("age") Integer ag) {
// 参数加注解
System.out.println(nm + "," + ag);
return "hncu";
}
如果需要限定参数,例如必须填,或者不填:
// 限制某参数必填,必须提交参数'age=',至于值是多少不管
@RequestMapping(value = "/s1", method = { RequestMethod.POST })
// 改变提交方式
public String s1(@RequestParam(name = "name", required = true) String nm,
@RequestParam(name = "age") Integer ag) {
// 参数加注解
System.out.println(nm + "," + ag);
return "hncu";
}
也可以直接在请求路径URL中给参数:
// 演示从URL路径中提取参数
@RequestMapping(value = "/s2/{name}/{age}")
public String s2(@PathVariable("name") String nm,
@PathVariable("age") Integer ag) {
// 参数加注解
System.out.println(nm + "," + ag);
return "hncu";
// http://127.0.0.1:8080/springmvcDemo2/sp/s2/Rose/30
}
还可以限制请求头:
// 演示请求头的限定 ↓
@RequestMapping(value = "/s3", params = { "name", "!age" }, headers = { "referer=http://127.0.0.1:8080/springmvcDemo2/" })
// 限定提交的参数必须包含name,不包含age,防盗链(限定请求必须包含某key的参数)
public String s3() {
System.out.println("OK!");
return "hncu";
}
可以将servlet的req,resp拿到作为参数:
// 演示注入原装的request,response
@RequestMapping(value = "/s4")
public ModelAndView s4(HttpServletRequest req, HttpServletResponse resp) {
// 要什么功能拿就有
String name = req.getParameter("name");
String age = req.getParameter("age");
ModelAndView mv = new ModelAndView();
mv.setViewName("hncu2");
mv.addObject("name", name);
mv.addObject("age", age);
return mv;
}
它会自动封装javabean:
// 演示自动封装参数到JavaBean(级联的都可以)
@RequestMapping(value = "/s5")
public String s5(User user) {
System.out.println("user:" + user);
return "hncu2";
}
使用的javabean:
加上SET,GET,ToString
也可以用PUT来提交
// 演示请求方式是PUT方式,顺带演示从请求地址和表单接受参数
@RequestMapping(value = "/s6/{name1}", method = { RequestMethod.PUT })
public String s6(@PathVariable("name1") String name1,
@RequestParam("name2") String name2) {
System.out.println(name1 + "," + name2);
return "hncu2";
}
演示可以注入其他数据,例如session:
//该类实现
// 演示绑定(注入)其他数据 如session,请求头中的信息
@RequestMapping(value = "/s7")
public String s7(HttpSession session,
@RequestHeader("accept") String accept,
@CookieValue("JSESSIONID") String sessionId, User user) {
System.out.println("session" + session + "<br/>");
System.out.println("accept" + accept + "<br/>");
System.out.println("JSESSIONID" + sessionId + "<br/>");
System.out.println("User" + user + "<br/>");
return "hncu2";
}
还有数组,集合类型:
// 绑定数组,集合等类型的请求参数
@RequestMapping(value = "/s8")
public String s8(@RequestParam("h") String[] hobbys,
@RequestParam("ss") List<String> ss) {
// http://127.0.0.1:8080/springmvcDemo2/sp/s8?h=music&h=game&h=sport&ss=aa&ss=bb
// System.out.println("hobbys:"+hobbys);地址
for (String str : hobbys) {
System.out.println("hobbys:" + str);
}
System.out.println("ss" + ss);
return "hncu2";
}
还有servlet原生API接口:
// 演示绑定Servlet原声API类的接口,WebRequest
@RequestMapping(value = "/s9")
public String s9(WebRequest req) {
System.out.println("req" + req);
return "hncu2";
}
利用文件下载工具类实现文件下载与文件上传
先导包:
文件下载演示:
// 文件下载//
@RequestMapping(value = "/f1")
public void f1(OutputStream out, HttpSession s, HttpServletRequest req,
HttpServletResponse resp) {
String path = s.getServletContext().getRealPath("/up/a.doc");
// 设置为下载类型
resp.setContentType("application/force-download");
resp.setHeader("Content-Disposition", "attachment;filename=a.doc");
// 2.5版本2个包commons-io和commons-fileupload
try {
InputStream in = new FileInputStream(path);
// 使用文件上传包中拷贝流工具,把字节流数据发送给客户端(out)
Streams.copy(in, out, true);
} catch (Exception e) {
e.printStackTrace();
}
}
文件上传
单文件
// 单文件版
@RequestMapping(value = "/f2")
// 要求必须上传file
public String f2(@RequestParam("file") MultipartFile file) {
// 配置文件hncu-servlet.xml的multipartResolver
/*
* 本地路径(也可以和f1方法一样用session) ---这里以 获取ServletContext的方式来得到磁盘路径
* 当前类需要实现ServletContextAware
*/
String path = ctx.getRealPath("/up");
try {
Streams.copy(file.getInputStream(), new FileOutputStream(path + "/"
+ file.getOriginalFilename()), true);
System.out.println("文件上传成功...");
} catch (Exception e) {
e.printStackTrace();
}
return "hncu3";
}
private ServletContext ctx = null;
//拿容器
@Override
public void setServletContext(ServletContext ctx) {
this.ctx = ctx;
}
多文件
//多文件版
@RequestMapping(value = "/f3")
// 要求必须上传file
public String f3(@RequestParam("file") List<MultipartFile> files) throws Exception {
if (files!=null) {
String path = ctx.getRealPath("/up");
for(MultipartFile file : files){
if(file!=null && !file.isEmpty()){ //非空
Streams.copy(file.getInputStream(), new FileOutputStream(path + "/"
+ file.getOriginalFilename()), true);
}
}
}
return "hncu3";
}
演示SpringMVC与Service层的整合
现在stud中将架构搭好:
利用注解将dao,service注入:
首先在DAO的实现类加一个注解:
在要注入的地方加个注解:
演示: