IDEA创建SpringMVC项目并部署(含Controller和View互相传值,以及406,415状态码的处理)
- 1.创建项目
- 2.项目命名
- 3. 在WEB-INF目录下建classes等目录
- 4. 配置Tomcat
- 5. 添加类库
- 6. 运行项目
- 7.创建文件并配置
- 8. Controller和View互相传值
- (1)view和Controller互传简单类型
- (3)Controller接收json数据并传回前端
1.创建项目
勾选SpringMVC 及 web Application(自动勾选),然后下一步
2.项目命名
命名后点finish
3. 在WEB-INF目录下建classes等目录
建议建一样的目录
4. 配置Tomcat
点击Configure设置,选择Tomcat
点击 + 号添加Tomcat
点击1号位选择Tomcat目录,2号位自动生成,点击OK保存
出来,选择刚添加的Tomcat,点击OK保存
创建Artifact完之后点OK保存
5. 添加类库
file》Project Structure,选择Artifact,底部有黄色警告,点击所选位置,添加类库
添加完如图:
点击OK保存
6. 运行项目
打开index.jsp 点击右上角
运行项目
如图,成功运行项目
7.创建文件并配置
项目已经成功运行了,接下来开始MVC的东西
- Controller
在src目录下建包(必须要有包名,默认包运行不了),然后创建 HelloWorldController.java 文件,如图: @Controller
说明这个类是一个控制器@RequestMapping("/hello")
表示整个控制器的地址是/hello@RequestMapping("/hw")
表示 helloWorld()方法的地址是/hwreturn "hw"
表示进入helloWord之后会转到hw.jsp页面(需要配置视图解析器)- 配置前端控制器DispatcherServlet
实际上项目创建好之后,IDEA已经自动帮我们在web.xml文件中配置好DispatcherServlet了,如图: <url-pattern>*.from</url-pattern>
表示已 .from 结尾的URL地址,将会请求转发只相应的控制器处理
一般情况下本人会将.from改成/- 配置 component-scan
在dispatcher-servlet.xml文件中配置component-scan
,让系统能找到你所创建好的控制器<context:component-scan base-package="com.hyt.controller"/>
- 配置视图解析器 ViewResolver
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 视图的路径 -->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!-- 视图名称后缀 -->
<property name="suffix" value=".jsp"/>
</bean>
上面控制器 return "hw"
经过视图解析器的解析会到 /WEB-INF/jsp/ 目录下找名字为 hw 后缀名为 .jsp
以上全部配置好之后运行项目,输入 http://localhost:8080/pictureupdate/hello/hw
即可看到如下页面
url中的pictureupdate 是上面配置Tomcat时设置的项目名,如图
hello 和 hw 则为控制器中两个 @RequestMapping
注解中的地址
- 通过返回ModelAndView,跳转至jsp页面
@RequestMapping("/hw1")
public ModelAndView helloWorld1() {
ModelAndView mv = new ModelAndView();
mv.setViewName("hw1");
return mv;
}
在浏览器中输入http://localhost:8080/pictureupdate/hello/hw1
,即可进入hw1.jsp页面
8. Controller和View互相传值
(1)view和Controller互传简单类型
hw.jsp 向 controller 传值,controller 转向 hw1.jsp(与上面的V向C传值结合)
controller
@RequestMapping("hw")
public String hw(Model model) {
return "hw";
}
@RequestMapping(value = "hw1", method = {RequestMethod.GET, RequestMethod.POST})
public ModelAndView hw1(String name, String sex, Integer age) {
ModelAndView mv = new ModelAndView();
mv.addObject("name", name);
mv.addObject("sex", sex);
mv.addObject("age", age);
mv.setViewName("hw1");
return mv;
}
@RequestMapping(value = "hw2", method = {RequestMethod.GET, RequestMethod.POST})
public String hw2(String name, String sex, Integer age, Model model) {
model.addAttribute("name", name);
model.addAttribute("sex", sex);
model.addAttribute("age", age);
return "hw1";
}
view
hw.jsp
<body>
<%--<form method="post" action="${pageContext.request.contextPath}/hello/hw1">--%>
<form method="post" action="${pageContext.request.contextPath}/hello/hw2">
name:<input type="text" name="name"/>
sex:<input type="text" name="sex"/>
age:<input type="text" name="age"/>
<input type="submit" value="submit">
</form>
</body>
hw1.jsp
<body>
name:${name}, sex:${sex}, age:${age}
</body>
###(2)View和Controller互传对象(Controller用对象接收数据,用对象将数据传给View)
pojo
注:对象必须要有默认构造器,否则会报错:No default constructor found; nested exception is java.lang.NoSuchMethodExce
public class User {
private String name;
private String sex;
private int age;
public User() {
super();
}
public User(String name, String sex, int age) {
this.name = name;
this.sex = sex;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", sex='" + sex + '\'' +
", age=" + age +
'}';
}
}
Controller
@Controller
@RequestMapping("/hello")
public class HelloWorldController {
@RequestMapping("/hw")
public String helloWorld(){
return "hw";
}
@RequestMapping("/hw1")
public String helloWorld1(User user, Model model) {
model.addAttribute("user", user);
return "hw1";
}
}
hw.jsp
<body>
<form method="post" action="${pageContext.request.contextPath}/hello/hw1">
name:<input type="text" name="user.name"/>
sex:<input type="text" name="user.sex"/>
age:<input type="text" name="user.age"/>
<input type="submit" value="submit">
</form>
</body>
hw1.jsp
<body>
name: ${user.name}, sex: ${user.sex}, age: ${user.age}
</body>
以上是Controller和View互传简单类型和对象的实例
(3)Controller接收json数据并传回前端
Controller接收json字符串,自动转换成对象;返回对象,自动转换成json字符串传给前端
添加 Jackson.jar 包
Jackson.jar下载地址:http://repo1.maven.org/maven2/com/fasterxml/jackson/core/
在项目中添加jar包:Project Structure》Module
点击 + ,找到对应的位置将jar包添加进来
点击 Artifacts ,像上面添加spring的jar包一样,将Jackson.jar 包添加进项目
Controller
@RequestMapping("/hw2")
@ResponseBody
public User helloWorld(@RequestBody User user) {
return user;
}
注:@ResponseBody和@RequestBody分别放不同的位置,不能乱了
运行项目,使用Google浏览器插件Restlet进行访问测试(配置还未完成,访问 http://localhost:8080/pictureupdate/hello/hw2 将会报错,并返回406状态码)
注:Content-Type 必须是 application/json
填充好数据之后发送请求,将会返回406状态码,访问失败。需要在spring配置文件(applicationContext.xml)中配置
<!-- 避免IE执行AJAX时,返回JSON出现下载文件
spring3为:MappingJacksonHttpMessageConverter
spring4为:MappingJackson2HttpMessageConverter
-->
<bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
</list>
</property>
</bean>
<!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="mappingJacksonHttpMessageConverter" /><!-- json转换器 -->
</list>
</property>
</bean>
此时如果重启项目,测试。将会返回 415 状态码,访问还是失败,还需要在 dispatcher-servlet.xml文件中添加<mvc:annotation-driven />
配置。若添加是报错,则需要在beans标签中添加配置:
添加属性:
xmlns:mvc=“http://www.springframework.org/schema/mvc”
在 xsi:schemaLocation
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
至此完成所有配置,重启项目,再次测试访问情况,返回200状态码,访问成功,并成功拿到json数据
IDEA创建SpringMVC项目并部署,C和V传值(简单类型,对象,json数据)演示到此结束。
笔者能力有限,有什么错误的或不足之处,可在下方留言或私信探讨,互相学习,谢谢!