Spring MVC请求参数绑定 自定义类型转化 和获取原声带额servlet request response信息
首先还在我们的框架的基础上建立文件
在domian下建立Account实体类
import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller @RequestMapping(value = "/account") public class Account { private String username; private String password; private Double money; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Double getMoney() { return money; } public void setMoney(Double money) { this.money = money; } @Override public String toString() { return "Account{" + "username='" + username + '\'' + ", password='" + password + '\'' + ", money=" + money + '}'; } }
然后在controller中的 类中进行对象绑定
在controller中的ParamsController中的建立一个方法接受这个类对象
@RequestMapping(value = "/accout") public String save(Account account){ //把Account类中的信息都有封装进去 return "success"; }
然后传参的时候把对象的值得信息给传递进去
前端定义界面
<form action="/params/accout" method="post"> 姓名:<input name="username" type="text"/> <br/> //传递的是account类中的属性值 因为请求路径中需要的参数的封装进了account类中 也就是把参数给整合了 密码:<input name="password" type="text"/> <br/> 金额:<input name="money" type="text"/> <br/> <input type="submit" value="提交"/> </form>
这个时候请求是可以成功的 因为就相当于把需要的参数给整合在一起了
如果对象中再包含对象怎么做呢?
下面看
我们再建立一个对象类User
User:
public class User { private String username; private String u_password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getU_password() { return u_password; } public void setU_password(String u_password) { this.u_password = u_password; } @Override public String toString() { return "User{" + "username='" + username + '\'' + ", u_password='" + u_password + '\'' + '}'; } }
然后把User这个对象传递到Account中
get set 和toString方法也要重新生成
然后再把Account当成参数的时候 那么久也需要对Account中封装的User类也要传递参数的
这个时候的前端传值要把那个对象的名字也加上
前端传值: 直接在值前面加上对象. 值
<form action="/params/accout" method="post">
<!--姓名:<input name="account.name" type="text"/> <br/>--> <!--这里不可以指定对象传值不然就会识别不到-->
姓名:<input name="name" type="text"/> <br/> 密码:<input name="password" type="text"/> <br/> 金额:<input name="money" type="text"/> <br/> User名字:<input name="user.username" /><br/> User密码:<input name="user.u_password"/><br/> <input type="submit" value="提交"/> </form>
解决中文乱码问题
如果我们输入中文的话 不会报错但是显示就是乱码的
因为web.xml控制着和前端交互的配置 我们就需要再这里配置下
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>
再输入中文就不会乱码了
输入:
输出信息:
也可以在Controller中加 但是那样就要每个Controller都要加了
在controller中的RequestMapping中加入
produces = "text/html; charset=utf-8"
这样也可以对这个请求的返回都解决中文乱码 但是其他的Controller不解决 所以还是配置中加比较好
自定义类型转化器:
我们再设置请求参数的时候 有时候本该是String的我们输入Integer也可以这就是Spring mvc为我们自动做的类型转化 但是有些是需要我们自己转化的比如日期
定义一个User类 其中包含 Date 属性
import javax.xml.crypto.Data; import java.util.Date; public class User { private String username; private String u_password; private Date date; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getU_password() { return u_password; } public void setU_password(String u_password) { this.u_password = u_password; } public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } @Override public String toString() { return "User{" + "username='" + username + '\'' + ", u_password='" + u_password + '\'' + ", date=" + date + '}'; } }
定义一个Controller
@RequestMapping(value = "/user") public String save(User user){ System.out.println("User"+user); return "success"; }
然后前端定义
<form action="/params/user" method="post"> User名字:<input name="username" /><br/> User密码:<input name="u_password"/><br/> User日期:<input name="date"/><br/> <input type="submit" value="提交"/> </form>
此时我们输入斜杆的日期是可以被识别的这是正规的日期输入格式
输出:
UserUser{username='zyl', u_password='123232', date=Mon Mar 04 00:00:00 CST 2019}
然后我们输入字符串格式的
然后就输出
是不被识别的 ,既然不被识别那么我们就要自定义类型转换器来进行数据类型的转化
转换步骤:
一:先编写转化的类方法
我再我们的java/cn/itcas/目录下再编写了一个StringToDateConverter类用来编写方法
StringToDateConverter: 因为本身java提供了这个转换的接口Converter我们只需要重写这个接口就可以了
package cn.itcas.utils; import org.springframework.core.convert.converter.Converter; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; /** * 把字符串转换为日期 * */ public class StringToDateConverter implements Converter<String, Date>{ /** * * @param source 传递进来的值 * @return */ @Override public Date convert(String source){ //必须实现这个方法不然会报错 if(source == null){ throw new RuntimeException("请您传入数据"); } try { DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); // 解析字符串 定义格式 Date date = df.parse(source); return date; } catch (Exception e) { throw new RuntimeException("类型转换错误"); } } }
二 :为了让你的方法生效就需要再配置文件中进行配置
springmvc.xml
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"> <property name="converters"> <set> <bean class="cn.itcas.utils.StringToDateConverter"/> <!--这里是你的转化的Controller--> </set> </property> </bean> <!-- 开启springmvc框架 注解打开 --> <mvc:annotation-driven conversion-service="conversionService"/> <!--把我们的类型转化器生效-->
然后再输入字符串就可以成功了
打印信息:
UserUser{username='zy', u_password='123232', date=Mon Mar 04 00:00:00 CST 2019}
获取原生的servlet信息
首先我们获取的信息都是传递来的 那么想要获取 原生的request 和response信息的话 怎么来获取呢?
其实很简单只需要通过HttpServletRequest 和HttpservletResponse这两个对象来获取就可以了
就像python中的 我们可以直接通过get和post来拿到request和response的信息
前端:
<a href="/params/testSerlet"> 获取原生的servlet信息</a>
controller:
/** * 获取原生的serlet请求信息 * @return */ @RequestMapping("/testSerlet") public String testSerlet(HttpServletRequest request, HttpServletResponse response){ // 如果我们想要 进行原生的serlet信息获取就要先传递两个原生的信息 HttpSession session = request.getSession(); // 从request中获得请求的session System.out.println("session:"+session); System.out.println("session:"+session.getAttributeNames()); ServletContext context = session.getServletContext(); // 从session中获取请求连接 System.out.println("context"+context); return "params"; }