1、在web.xml中配置核心控制器
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
2.在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-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3.springmvc的xml配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 开启注解扫描 -->
<context:component-scan base-package="cn.xmz"/>
<!-- 视图解析器对象 -->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!-- 配置自定义类型转换器-->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="cn.xmz.utils.StringToDateConverter"/>
</set>
</property>
</bean>
<!-- 开启SpringMVC框架注解的支持 -->
<mvc:annotation-driven conversion-service="conversionService"/>
</beans>
4.相关注解的使用
/**
* 属性:
* path和value一样
* method设置请求方式
* params指定限制请求参数的条件,支持简单的表达式,请求参数的key和value必须和配置的一模一样
* headers:限制请求头的条件
* @return
*/
@RequestMapping(path = "/testRequestMapping",method = {RequestMethod.POST},
params = {"username","password=123"},headers = {"Accept"})
public String testRequestMapping(){
System.out.println("测试RequestMapping");
return "success";
}
@Controller
@RequestMapping("anno")
@SessionAttributes(value = {"msg"})//吧msg=美美存到session域中
public class AnnoController {
/*RequestParam的required属性默认开启*/
@RequestMapping("/testRequestParam")
public String testRequestParam(@RequestParam(name = "name",required = true) String username){
System.out.println("anno/testRequestParam");
return "success";
}
@RequestMapping("/testRequestBody")
public String testRequestBody(@RequestBody String body){
System.out.println("anno/testRequestBody");
System.out.println(body);
return "success";
}
@RequestMapping("/testPathVariable/{sid}")
public String testPathVariable(@PathVariable(name = "sid") String id){
System.out.println("anno/testPathVariable/10");
System.out.println(id);
return "success";
}
/*获取请求头信息*/
@RequestMapping("/RequestHeader")
public String testRequestHeader(@RequestHeader(value = "Accept") String header){
System.out.println("anno/RequestHeader");
System.out.println(header);
return "success";
}
/*获取cookie内容*/
@RequestMapping("/testCookieValue")
public String testCookieValue(@CookieValue(value = "JSESSIONID") String cookieValue){
System.out.println("anno/testCookieValue");
System.out.println(cookieValue);
return "success";
}
/**/
@RequestMapping("/testModelAttribute")
public String testModelAttribute(@ModelAttribute("abc") User user){
System.out.println("anno/testModelAttribute");
System.out.println(user);
return "success";
}
/*该方法会先执行,方式一*/
// @ModelAttribute
public User showUser(){
User user = new User();
user.setId("1");
user.setName("1");
user.setPassword("1");
System.out.println("showUser");
return user;
}
/*该方法会先执行,方式二*/
@ModelAttribute
public User showUser(Map<String, User>map){
User user = new User();
user.setId("1");
user.setName("1");
user.setPassword("1");
map.put("abc",user);
System.out.println("showUser");
return user;
}
/*
model设置
ModelMap 取
SessionStatus.setComplete清除session
* */
@RequestMapping("/testSessionAttributes")
public String testSessionAttributes(Model model, ModelMap modelMap, SessionStatus status){
System.out.println("anno/testSessionAttributes");
/*底层会存储到request域对象中*/
model.addAttribute("msg","美美");
String msg = (String)modelMap.get("msg");
System.out.println(msg);
status.setComplete();
return "success";
}
}
5.controller中方法的返回值
@RequestMapping("testString")
public String testString(Model model){
System.out.println("testString");
User user = new User();
user.setId(1);
user.setUsername("美美");
user.setPassword("123456");
model.addAttribute("user", user);
return "success";
}
/*无返回值默认请求/WEB-INF/pages/user/testVoid.jsp
* 可以使用HttpServletRequest进行请求转发
* */
// @RequestMapping("testVoid")
// public void testVoid(Model model){
// System.out.println("testVoid");
// }
@RequestMapping("testVoid")
public void testVoid(HttpServletRequest request, HttpServletResponse response) throws Exception{
System.out.println("testVoid");
/*转发*/
// request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response);
/*重定向*/
// response.sendRedirect(request.getContextPath()+"/WEB-INF/pages/success.jsp");
/*设置中文乱码*/
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
/*直接响应*/
response.getWriter().print("hello 世界");
}
@RequestMapping("testModelAndView")
public ModelAndView testModelAndView(){
System.out.println("testModelAndView");
ModelAndView mv = new ModelAndView();
User user = new User();
user.setId(1);
user.setUsername("小明");
user.setPassword("123456");
/*会把user存入到request*/
mv.addObject("user",user);
/*跳转页面*/
mv.setViewName("success");
return mv;
}
@RequestMapping("testForwardOrRedirect")
public String testForwardOrRedirect(){
System.out.println("testForwardOrRedirect");
/*转发*/
// return "forward:/WEB-INF/pages/success.jsp";
return "redirect:/index.jsp";
}
// @RequestMapping("testAjax")
// public void testAjax(@RequestBody String body,HttpServletRequest request, HttpServletResponse response) throws Exception{
// System.out.println("testAjax");
// System.out.println(body);
// /*设置中文乱码*/
// response.setCharacterEncoding("UTF-8");
// response.setContentType("text/html;charset=UTF-8");
//
// /*直接响应*/
// response.getWriter().print(body);
// }
@RequestMapping("testAjax")
public @ResponseBody User testAjax(@RequestBody User user){
System.out.println("testAjax");
System.out.println(user);
user.setId(10);
return user;
}
6.异常处理
<!--配置异常处理器-->
<bean id="sysExceptionResolver" class="cn.xmz.exception.SysExceptionResolver"></bean>
@RequestMapping("/testException")
public String testException() throws SysException{
System.out.println("testException执行了");
/*快捷键ctrl+alt+t,对选中代码块进行操作,如try catch*/
try {
int a =10/0;
} catch (Exception e) {
e.printStackTrace();
throw new SysException("查询所有用户出现错误");
}
return "error";
}
private String message;
@Override
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public SysException(String message) {
this.message = message;
}
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse, Object o, Exception e) {
//获取异常对象
SysException se = null;
if(e instanceof SysException){
se = (SysException) e;
}else {
se = new SysException("系统正在维护");
}
/*创建ModelAndView*/
ModelAndView mv = new ModelAndView();
mv.addObject("errorMsg", se.getMessage());
mv.setViewName("error");
return mv;
}
7.文件上传
<!--配置文件解析器-->
<!--id="multipartResolver"这个是必须的-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="10485760"></property>
</bean>
<h3>传统文件上传</h3>
<form action="/file/upload1" method="post" enctype="multipart/form-data">
选择文件:<input type="file" name="upload1">
<input type="submit" value="上传">
</form>
<h3>springmvc文件上传</h3>
<form action="/file/upload2" method="post" enctype="multipart/form-data">
选择文件:<input type="file" name="upload2">
<input type="submit" value="上传">
</form>
<h3>跨服务器文件上传</h3>
<form action="/file/upload3" method="post" enctype="multipart/form-data">
选择文件:<input type="file" name="upload3">
<input type="submit" value="上传">
</form>
@RequestMapping("/upload1")
public String fileUpload1(HttpServletRequest request) throws Exception {
System.out.println("传统文件上传");
String path = request.getSession().getServletContext().getRealPath("/uploads");
System.out.println(path);
File file = new File(path);
/*判断路径是否存在*/
if(!file.exists()){
/*创建新文件夹*/
file.mkdirs();
}
/*解析request对象,获取上传文件项*/
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
List<FileItem> items = upload.parseRequest(request);
for (FileItem item:items){
if(item.isFormField()){
/*普通表项*/
}else{
/*文件项*/
String filename = item.getName();
/*uuid*/
String uuid = UUID.randomUUID().toString().replace("-", "");
filename = uuid+filename;
item.write(new File(path, filename));
item.delete();
}
}
return "success";
}
@RequestMapping("/upload2")
public String fileUpload2(HttpServletRequest request, MultipartFile upload2) throws Exception {
System.out.println("springmvc文件上传");
String path = request.getSession().getServletContext().getRealPath("/uploads");
System.out.println(path);
File file = new File(path);
/*判断路径是否存在*/
if(!file.exists()){
/*创建新文件夹*/
file.mkdirs();
}
String filename = upload2.getOriginalFilename();
/*uuid*/
String uuid = UUID.randomUUID().toString().replace("-", "");
filename = uuid+filename;
upload2.transferTo(new File(path, filename));
return "success";
}
/*跨服务器上传*/
@RequestMapping("/upload3")
public String fileUpload3(HttpServletRequest request, MultipartFile upload3) throws Exception {
System.out.println("跨服务器文件上传");
String path = "http://localhost:9090/uploads";
String filename = upload3.getOriginalFilename();
/*uuid*/
String uuid = UUID.randomUUID().toString().replace("-", "");
filename = uuid+filename;
/*创建客户端对象*/
Client client = Client.create();
/*与图片服务器进行连接*/
WebResource webResource = client.resource(path + filename);
/*上传文件*/
webResource.put(upload3.getBytes());
/*可能报未存在文件夹的错误,手动创建就好了*/
return "success";
}
8.拦截器
<!--配置拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<!-- 要拦截的具体方法-->
<mvc:mapping path="/**"/>
<!--不拦截的方法-->
<!-- <mvc:exclude-mapping path=""/>-->
<bean class="cn.xmz.interceptor.MyInterceptor"></bean>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="cn.xmz.interceptor.MyInterceptor2"></bean>
</mvc:interceptor>
</mvc:interceptors>
/*
* 预处理,controller方法执行之前
* return true 放行,执行下一个拦截器,如果没有执行controller中的方法
* return false 不放行
* */
// ctrl + o快捷键实现接口方法
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("MyInterceptor执行了");
// request.getRequestDispatcher("/response.jsp").forward(request,response);
request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response);
return false;
// return true;
}
//最后处理方法,最后以该方法的跳转为主
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
9.其他xml配置
<!-- 配置自定义类型转换器-->
<!-- <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">-->
<!-- <property name="converters">-->
<!-- <set>-->
<!-- <bean class="cn.xmz.utils.StringToDateConverter"/>-->
<!-- </set>-->
<!-- </property>-->
<!-- </bean>-->
<!--前端控制器,哪些静态资源不拦截-->
<mvc:resources mapping="/js/**" location="/js/"/>
<mvc:resources mapping="/css/**" location="/css/"/>
<mvc:resources mapping="/images/**" location="/images/"/>