是根据B站视频中尚学堂某个老师的视频自学来的,不保证正确,算是自己踩的一些坑.大概是根据那个进行总结了一下.都是比较基础的东西吧.
视频地址
- web.xml的配置.
: 配置为Servlet,
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!--下面设置为更改默认配置文件,如果不设置这里,那么需要在WEB-INF下面写一个springmvc的配置文件
默认名字为 servletName-servlet.xml如这里的springmvc-servlet.xml-->
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:mvc.xml</param-value>
</init-param>
<!-- load-on-startup定义为1即为应用开始即执行.-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!--这里的url-parrrern我理解为打开springmvc的设置,即只有访问到这里的时候才会运行springmvc.如果设置为根目录,则任何时候都会执行springmvc,然后在springmvc的配置文件里执行查找处理器,渲染等操作.-->
<url-pattern>/</url-pattern>
</servlet-mapping>
- 配置springmvc的配置文件.
: 流程大概就是handlermapping处理传进来的url地址并交给控制器进行处理,处理之后的数据交给渲染器,然后返回页面.
有两种方法可以进行配置
1.使用xml文件配置.
: 第一种方法
```
<!--配置handler mapping-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!--配置handler adapter,根据教程所讲内容,若配置这里springmvc会自动进行适配,若不配置这里,则请求的url地址严格根据名字来进行(包括后缀)-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
<!--配置渲染器-->
<bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!--配置接收和处理器-->
<bean name="/hello" class="com.netizen.springmvc.HelloComtroller"></bean>
```
: 第二种方法
```
<!--第二种配置springmvc的controller的方法,非注解的方法,使用集合,一次性配置多个controller-->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<!--key对应url的请求地址,value为处理器的!! ID !!,这样还需要在外部再写一个bean进行配置.-->
<prop key="hello.do">HelloController</prop>
</props>
</property>
</bean>
<bean id="HelloController" class="com.netizen.springmvc.HelloComtroller"></bean>
```
: 第三种方法
```
<!--第三种配置,URL匹配,这个没太明白,好像是根据Controller的类名字来进行匹配的,不太懂-->
<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"></bean>
<!--比如这里的类名字为helloController,那么将自动匹配url为hello*的地址进行处理.-->
<bean id="HelloController" class="com.netizen.springmvc.HelloComtroller">
```
**2.使用注解**
```
<!--添加下列语句自动扫包,然后只配置一个渲染器.-->
<context:component-scan base-package="com.netizen.springmvc"/>
<!--配置渲染器-->
<bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
```
-
-
控制器类的填写,请求过来的内容在这里进行处理.
-
两种实现方法
1.不使用注解,对应springmvc不使用注解的配置
//实现Controller接口,然后重写方法,handleRequest,返回一个ModelAndView实例. public class HelloComtroller implements Controller { @Override public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { ModelAndView mv = new ModelAndView();
-
两种实现方法
// 这里还不是很理解.
mv.addObject(“msg”,“hello,springmvc”);
// 视图名字,在这里设置好之后对应springmvc配置文件里面的前后缀方法,会自动在应用里寻找视图,如这里会寻找/WEB-INF/jsp/hello.jsp.
mv.setViewName(“hello”);
return mv;
}
}
2.使用注解:
//添加Controller注解和RequestMapping()注解进行配置,对应使用注解的springmvc配置.
@Controller
public class HelloC {
// 请求为*.do的时候就会去寻找一个hello的视图去返回.在web.xml里面配置的是当请求在/的时候会调用mvc的框架开始运行和处理.
@RequestMapping("/*.do")
public ModelAndView hello(HttpServletRequest request, HttpServletResponse response){
ModelAndView mv = new ModelAndView();
mv.addObject(“msg”,"annotation springmvc ");
mv.setViewName(“hello”);
return mv;
}
}
----------
- **数据处理和转发**
: 内容比较少,这部分都写在代码里面了,要注意一下return时候的跳转,这是在没有页面渲染器的情况下写的,跳转到的都是index.jsp,因为index在根目录下,这里我感觉不使用渲染器那么就得写绝对路径了,感觉上有点不太方便.
```
package com.netizen.springmvc;
//转发和重定向的方法.
import ...
@Controller
public class HelloZF {
@RequestMapping("/hello1")
public void hello1(HttpServletRequest request,HttpServletResponse response) throws IOException {
response.getWriter().println("转发和跳转的实验1");
}
// 使用HttpServlet进行重定向
@RequestMapping("/hello2")
public void hello2(HttpServletRequest request,HttpServletResponse response) throws IOException {
response.sendRedirect("index.jsp");
}
//使用HttpServlet进行转发
@RequestMapping("/hello3")
public void hello3(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("msg","hello3 method");
request.getRequestDispatcher("index.jsp").forward(request,response);
}
// 通过springMVC进行转发和重定向----上面的就是普通的Servlet-api的方法.下面这是无视图解析器时候的方法.
@RequestMapping("/hello4")
public String hello4(HttpServletRequest request,HttpServletResponse response){
//这里的return hello,实际上因为有视图解析器的存在会跳到WEB-INF/jsp路径下去寻找..
// return "hello";
System.out.println("request的值为 ---" + request);
request.setAttribute("msg","index.jsp have been forward");
return "forward:index.jsp";
// return "redirect:index.jsp";
}
// 通过SpringMVC进行转发和重定向 ----有视图解析器的时候.
@RequestMapping("/hello5")
public String hello5(){
// 没节省多少,转发可以少写.重定向的话因为是直接跳到另一个网页上,所以不需要视图解析器.
// return "hello";
return "redirect:index.jsp";
}
// data的获取.可以指定域请求的参数名字,使用@RequestParam注解.
@RequestMapping("/hello6")
public String hello6(@RequestParam("uname")String name){
System.out.println("name的值为 ---" + name);
return "index.jsp";
}
//从域参数中得到一个实例
@RequestMapping("/user")
public String hello7(User user){
System.out.println(user);
return "index.jsp";
}
@RequestMapping("/hello8")
public String hello8(@RequestParam("uname")String name, ModelMap mp){
mp.addAttribute("name",name);
return "index.jsp";
}
}
```
**数据处理的内容还是相对简单的,这里我有一个疑问,就是post的咋办?后边学习应该会讲吧..**
----------
- 乱码的解决和Restful
: 乱码的解决
<!--SpringMVC的filter解决乱码的问题.这个方法似乎只能解决post乱码的问题.get乱码通常是因为jsp文件里面pageencoding属性不是utf-8-->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>CharacterEncodingFilter</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/</url-pattern>
</filter-mapping>
: Restful风格
// restful风格代码的编写,其实是一种从url地址中获得参数的方法,如此不用再写RequestParam
// 注意使用这种方法的时候,如果在web.xml里面定义了打开springmvc的url-pattern,那么需要变化后缀.
@RequestMapping("/hello9/{id}/{uid}")
public String hello(@PathVariable int id,@PathVariable int uid){
// 也可以使用下面这种方式,使用带参的注解,表示将url中id的值传递给了uid
// public String hello(@PathVariable(“id”) int uid,@PathVariable(“uid”) int id)
System.out.println(“id的值为 —” + id);
System.out.println(“uid的值为 —” + uid);
return “index.jsp”;
----------
- 使用commons-fileupload和commons-io包进行文件的上传
: 1.在springMVC的xml文件中配置fileupload的解析器.
```
<!--SpringMVC的filter解决乱码的问题.这个方法似乎只能解决post乱码的问题.get乱码通常是因为jsp文件里面pageencoding属性不是utf-8-->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>CharacterEncodingFilter</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/</url-pattern>
</filter-mapping>
: 2.编写fileupload的Controller
@Controller
public class fileUploadController {
@RequestMapping("/upload")
// 需要注意的一点是,这里必须要写 @requestparam(file)
public String fileupload(@RequestParam("file") CommonsMultipartFile file, HttpServletRequest request) throws IOException {
// 这里要比较熟悉java的IO才行,还不太熟练。
// 获取上传文件的路径。
String path = request.getRealPath("/fileupload");
// 因为已经是上传的文件,已经打开了一个写入流。
InputStream is = file.getInputStream();
// 输出流
OutputStream os = new FileOutputStream(new File(path,file.getOriginalFilename()));
int len=0;
byte[] buffer = new byte[400];
while((len=is.read())!=-1){
os.write(buffer,0,len);
}
os.close();
is.close();
return "index";
}
}
: 3.编写upload.jsp
<%--
method必须为post,enctype=multipart/form-data
--%>
<form action="upload" method="post" enctype="multipart/form-data">
file:<input type="file" name="file">
<input type="submit" value="上传">
</form>
: 4.坑:maven打包,不会打包webapp里面的fileupload文件夹.
查找了一些资料:
使用plugin 插件
使用插件
不忽略空文件夹
打包到指定文件夹 繁琐一些
以上方法似乎都不可行.我操.
到最后还是部署之后自己在target里创建的文件夹…
- 进行ajax和json的传递
: 1.使用HttpServlet
@Controller
public class AjaxController {
@RequestMapping("/ajax")
public void ajax(String name,HttpServletResponse response) throws IOException {
response.getWriter().println("123123");
}
: 2.使用jackson的包和配置文件进行设置.
主要需要注意的是springmvc的配置文件怎么写.视频里的那个类我没找到,百度得到结果是那个类已经不用了,改为使用另一个类,**还有一个说法是使用<!--<mvc:annotation-driven/>
**这个东西来进行对json的处理,但是我弄了之后总是报错,我也看不懂错在哪…所以还是使用了替代的类.
配置如下:
<!--注解的使用打开-->
<context:component-scan base-package="com.springMVC"></context:component-scan>
<!--打开json的解析器-->
<!--<mvc:annotation-driven></mvc:annotation-driven>-->
<bean id="stringConverter" class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/plain;charset=UTF-8</value>
</list>
</property>
</bean>
<bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"></bean>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="stringConverter"></ref>
<ref bean="jsonConverter"></ref>
</list>
</property>
</bean>
- 关于拦截器
: 视频中讲的很简单…配置一下,实现了三个方法.应该深入一些…
<!--配置拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.springMVC.interceptorController"></bean>
</mvc:interceptor>
</mvc:interceptors>
: 登陆拦截器,这里比较重要,对我来说有点弯路…
简单点来说就是当在login.jsp中点击submit提交到login
之后,本来应该是由UserController来进行处理,查看是否密码正确,如果正确则建立一个session,如果不正确返回到当前页面,现在加入了一个拦截器,作用就是拦截当前界面,查看是否已经登陆,实际上,我认为老师这里讲的不是很清晰,觉得流程应该是当访问一个页面的时候,如果没有用户没有登陆却访问了界面,那么就会被拦截下来,然后跳转到登陆界面,让用户进行登陆,如果访问的网址在允许访问的列表里面,才会接着进行访问,返回true,然后进行用户名密码的判断,如果正确则建立一个session.否则,重新开始.
- log4j idea的使用(Maven)
: 1.Maven的pom.xml中添加包依赖
: 2.配置log4j.properties,参考资料1 参考资料2 参考资料3
参考资料4:改变配置文件路径.
: 3.记得在pom.xml文件里面把log4j.properties的过滤给去掉.
- 使用IDEA创建SpringMVC(未使用Maven)
1.创建时选择SpringMVC,Spring,WebService三个,让idea自动下载包.
2.下载tomcat,配置好tomcat,包括端口一类的设置.
3.项目配置(ctrl+shift+alt+s):
: 导入Tomcat/lib下的servlet-api和jsp-api包,否则会找不到包(我似乎导入了也不能自动给出提示,还需要在类里手动导包,不懂咋回事.)
: 除此之外,还需要下载jstl
和standard
这俩包,否则在配置springmvc的时候同样会报错,具体情况不太了解,好像是servlet的xml配置标准根据这个来的.
: 在WEB-INF下创建classes和lib和jsp三个文件夹.
1.
2.
3.
4.
如此应该可以运行了.这里配置可能有误,因为我也看不懂,大概是整合了网上了的一些教程吧.
4.结构图.
使用Maven进行配置了一遍.根据这个教程:
SpringMVC的头文件
SpringMVC indea maven 配置教程
参考资料2
其中碰到的小坑1:需要安装完整的包:jstl jstl-api, standard jstl-impl 这四个都需要在maven里面配置上.
其中碰到的小坑2:自定义设置SpringMVC的xml文件位置的时候,由于maven的限制,不能输出到target里面,参考:maven idea springmvc target
其中碰到的小坑3:把配置文件全部放在了resource文件夹里面,但是输出的时候没有把这个文件夹输出,所以找不到xml和properties文件,注意,放在这里的文件的目录路径就是classpath.所以和放在java的source里面是一样的效果,需要对idea进行设置一下设置方法