7.响应
框架参数处理完毕后,就可以根据映射关系调用controller方法,传参。controller中获得参数后的业务处理,就由具体的业务程序完成(controller、service、dao)。
业务程序处理完毕后,需要响应:
①直接响应
直接响应文本字符串
直接响应集合对象(需要转换成json格式的字符串再响应)
②间接响应
转发(携带数据)
重定向(携带数据)
原来响应直接在业务程序中完成,现在由框架来完成,框架实现哪种响应由业务程序告知,业务程序告知时需要按照框架的规则告知。
①响应内容以返回值的形式返回给框架
②如果是间接响应,直接返回值
如果不需要携带数据
return “05.jsp” 转发
return “redirect:05.jsp” 重定向
如果需要携带数据
返回一个框架提供的ModelAndView对象
转发:数据会request.setAttribute()
重定向:数据会以?的形式跟在url后面(只支持String)
③如果是直接响应在返回值的同时需要为方法增加一个@ResponseBody注解
如果返回String、int、double等简单类型,直接以String返回
如果是其他类型,则认为需要转换成json
private void handleResponse(Object result, Method method, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
if(result==null){
//不需要框架响应
return;
}
ResponseBody rb=method.getAnnotation(ResponseBody.class);
if(rb!=null){
//直接响应
if(result instanceof String||result instanceof Integer||result instanceof Long||result instanceof Boolean){
//简单类型,直接以字符串形式响应
response.getWriter().write(result.toString());
}else{
//不是简单类型,集合对象需要转换成json再响应
String json= JSON.toJSONString(result);
response.setContentType("text/json");
response.getWriter().write(json);
}
}else{
//间接响应
if(result instanceof String){
//不需要携带数据
String _result=(String) result;
if(_result.startsWith("redirect:")){
//重定向
_result=_result.replace("redirect:","");
response.sendRedirect(_result);
}else{
//转发
request.getRequestDispatcher(_result).forward(request,response);
}
}else {
//需要携带数据
ModelAndView _result=(ModelAndView) result;
String path=_result.getViewName();
if(path.startsWith("redirect:")){
//重定向
path=path.replace("redirect:","");
path+="?";
Set<String>names=_result.getObjectNames();
for(String name:names){
Object value=_result.getObject(name);
path+=name+"="+value+"&";
}
path=path.substring(0,path.length()-1);
response.sendRedirect(path);
}else {
//转发
Set<String>names=_result.getObjectNames();
for(String name:names){
Object value=_result.getObject(name);
request.setAttribute(name,value);
}
request.getRequestDispatcher(path).forward(request,response);
}
}
}
}
package web;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class ModelAndView {
private String viewName;//05.jsp
private Map<String,Object> values=new HashMap<>();
public String getViewName() {
return viewName;
}
public void setViewName(String viewName) {
this.viewName = viewName;
}
public void addObject(String key,Object value){
values.put(key,value);
}
public Object getObject(String key){
return values.get(key);
}
public Set<String> getObjectNames(){
return values.keySet();
}
}
package web.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ResponseBody {
}