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.jspprivate 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 {}


