Spring启用注解、json、后台注解验证
基础搭建见mvc02
基础搭建步骤
web.xml文件和之前的一样
spring文件需要加上这些
<!-- 启动注解驱动 -->
<mvc:annotation-driven/>
<!--启用自动扫描 -->
<context:component-scan
base-package="com.wode.controller" />
<!-- ViewResolver视图解析器 用于将返回的ModelAndView对象进行分离 -->
<bean class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView"></property>
<property name="prefix" value="/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
和昨天的没所少区别,关键的是比昨天更加简单了
完成案例1:使用注解登录
首先使用第一个注解@Controller标注这个类是一个控制器
@RequestMapping(path="login",method=RequestMethod.GET)--这个东西就表明了使用的request路径
案例1也在基础搭建中
案例2:在这个控制器中添加一个注册的方法
我们发现在同一个类中不同业务区分是通过@RequestMapping("regist.do")来实现的这比以前要简单多了
案例3:为了简化开发,我们发现每次我们接受参数都需要使用request来接受,无形中增加了我们的代码量
我们可以这样
@RequestMapping("regist.do")
public String regist(String name,String pwd){ ---这里,我们的参数和表单提交保持一致
System.out.println(name+" "+pwd);
return "main";
}
如果不想一致呢?和我们mybatis中使用的方法一样
public String regist(String name,@RequestParam(value="pwd")String password){ //这样就可以了
System.out.println(name+" "+password);
return "main";
}
案例4:继续思考,之前我们就遇到过这样的问题,传递的参数太多了,我们要想办法把他封装成为一个对象
@RequestMapping("regist.do")
public String regist(UserBean bean){
System.out.println(bean.getUsername()+" "+bean.getPassword());
return "main";
}
这里需要注意的是表单中的name必须和bean中的属性名字一模一样,错一个字都不行
案例5
注意,我们之前传递参数是使用的req.setAttribute(arg0, arg1);这种方式来的,但是spring mvc为了简化这个操作,可以这样做
@RequestMapping("regist.do")
public String regist(UserBean bean,Map<String, Object> map){
System.out.println(bean.getUsername()+" "+bean.getPassword());
map.put("userName", bean.getUsername());
return "main";
}
这里使用的map来充当了request对象让我们更简单的操作
但是这里有个坑,我们在后边将重定向的时候讲解一下
案例6:我们经常要遇到ajax操作,这怎么做呢?
这里我们使用和之前差不多的方法:回忆下Servlet
@RequestMapping("doAjax.do")
public void doAjax(PrintWriter writer){ ---这里
writer.println("hello world");
}
我们接着在页面上就可以正常使用ajax了,还有我们之前的json的使用
案例7
那我们怎么在注解中使用转发和重定向呢?其是很简单
@RequestMapping("regist.do")
public String regist(UserBean bean,Map<String,Object> map){
System.out.println(bean.getUsername()+" "+bean.getPassword());
if(bean.getUsername().equals("zhangsan")){
//请求转发
return "forward:main.jsp";
}else{
//重定向
map.put("userName",bean.getUserName);
return "redirect:main.jsp";
}
}
分别转发和重定向一次,在重定向的位置发生了问题
就是重定向竟然有了参数??? -----原因就是map搞的
案例8:RequestMapping还有一个非常重要的参数
看这段代码:
@Controller
@RequestMapping("user.do") //我们在最前边写上了user.do用户的所有要使用的方法都在这个位置
public class UserController {
@RequestMapping(params="method=login")//通过参数确定我们到底使用的这个类中的哪一个方法
public String login(){
System.out.println("用户的登录了");
return null;
}
@RequestMapping(params="method=regist")
public String regist(){
System.out.println("用户注册了");
return null;
}
}
在表单中:
<form action="user.do" method="get" >
<input type="hidden" name="method" value="regist"><!--这里通过一个隐藏表单域来控制我们到底提交了哪个方法-->
name:<input type="text" name="username"><br />
pwd:<input type="password" name="password"><br />
<input type="submit">
</form>
-------------------------------重点------------------------------------------------------------
关于验证,我们使用spring+hibernateValidate的方式验证(想一想,为什么需要验证?为什么js不是很安全的验证)
首先引入一些必要的jar包,在案例mvc02中都有
需要我们手动配置的是:
web.xml中
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/mySpring-*.xml
</param-value>
</context-param>
mySpring-*.xml中
<bean id="validator"
class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean ">
<property name="providerClass" value="org.hibernate.validator.HibernateValidator" />
</bean>
<mvc:annotation-driven validator="validator" />
完成登录是用户空验证 案例:validate文件中
1:首先完成bean文件的验证 2:在controller中调用这些规则3:在jsp文件中使用spring
-------------------------------------------------------------------------------------------
案例9关于上传文件
首先在配置文件中添加上传组件
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 限制上传文件的大小 -1 为不限制 -->
<property name="maxUploadSize" value="-1">
</property>
</bean>
具体案例参考 upload文件
这里值得我们注意的是上传中文会乱码
我们需要这样做
1:在表单中accept-charset="utf-8"
2:web.xml文件中
<filter>
<filter-name>Set Character Encoding</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>Set Character Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
就可以了
案例10 关于json的使用
这里做了改进
<bean
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="mappingJacksonHttpMessageConverter" />
</list>
</property>
</bean>
<bean id="mappingJacksonHttpMessageConverter"
class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
</list>
</property>
</bean>
jsp页面发送ajax
@Controller
public class TestAction {
@RequestMapping("test.do")
public @ResponseBody List<UserBean> test1(String uname) throws Exception{ //这个东西是核心
List<UserBean> list = new ArrayList<UserBean>();
UserBean user=new UserBean();
user.setUsername("张三");
user.setPassword("admin");
UserBean user2=new UserBean();
user2.setUsername("lisi");
user2.setPassword("admin");
list.add(user);
list.add(user2);
return list;
}
@ResponseBody自动帮你做转换,我们只需要把jackson的jar包放进去就可以了,以前需要我们手动在xml文件中处理的
我们打开TCP/IP Monitor可以清楚的看到实验结果
案例11:我们现在可以从后台发送json过来了,那么如果我们需要把前台的数据通过json发送到后台呢?
代码:
function test(){
var saveUser=[];
var user1={"username":"test","password":"admin"};
var user2={"username":"ququ","password":"root"};
saveUser.push(user1);
saveUser.push(user2);
$.ajax({
type: "post",
url: "test.do",
data:$.toJSON(saveUser), //这里需要json转换jquery.json-2.4.js
contentType:"application/json",
success: function(msg){
alert( msg );
}
});
}
后台代码
public @ResponseBody List<UserBean> test1(@RequestBody List<UserBean> users) throws Exception{
System.out.println(users.size());
通过这个实验,我们发现我们传送过去了一个数组
实验
var v={username:"zhangsan",password:'admin'}
var t= $.toJSON(v);
$.ajax({
type: "post",
url: "test.do",
data:t,
contentType:"application/json",
success: function(msg){
alert( msg );
}
});
后台
public @ResponseBody List<UserBean> test1(@RequestBody UserBean u) throws Exception{
System.out.println(u.getUsername()+" "+u.getPassword());
可以正常接收前台的值了
实验接受一堆数值
function test(){
var nums=[];
var num1=10;
var num2=11;
nums.push(num1);
nums.push(num2);
$.ajax({
type: "post",
url: "test.do",
data:$.toJSON(nums),
contentType:"application/json",
success: function(msg){
alert( msg );
}
});
}
后台代码
public @ResponseBody List<UserBean> test1(@RequestBody List<Integer> nums) throws Exception{
System.out.println(nums.get(0)+" "+nums.get(1));