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

    1. private void handleResponse(Object result, Method method, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
    2. if(result==null){
    3. //不需要框架响应
    4. return;
    5. }
    6. ResponseBody rb=method.getAnnotation(ResponseBody.class);
    7. if(rb!=null){
    8. //直接响应
    9. if(result instanceof String||result instanceof Integer||result instanceof Long||result instanceof Boolean){
    10. //简单类型,直接以字符串形式响应
    11. response.getWriter().write(result.toString());
    12. }else{
    13. //不是简单类型,集合对象需要转换成json再响应
    14. String json= JSON.toJSONString(result);
    15. response.setContentType("text/json");
    16. response.getWriter().write(json);
    17. }
    18. }else{
    19. //间接响应
    20. if(result instanceof String){
    21. //不需要携带数据
    22. String _result=(String) result;
    23. if(_result.startsWith("redirect:")){
    24. //重定向
    25. _result=_result.replace("redirect:","");
    26. response.sendRedirect(_result);
    27. }else{
    28. //转发
    29. request.getRequestDispatcher(_result).forward(request,response);
    30. }
    31. }else {
    32. //需要携带数据
    33. ModelAndView _result=(ModelAndView) result;
    34. String path=_result.getViewName();
    35. if(path.startsWith("redirect:")){
    36. //重定向
    37. path=path.replace("redirect:","");
    38. path+="?";
    39. Set<String>names=_result.getObjectNames();
    40. for(String name:names){
    41. Object value=_result.getObject(name);
    42. path+=name+"="+value+"&";
    43. }
    44. path=path.substring(0,path.length()-1);
    45. response.sendRedirect(path);
    46. }else {
    47. //转发
    48. Set<String>names=_result.getObjectNames();
    49. for(String name:names){
    50. Object value=_result.getObject(name);
    51. request.setAttribute(name,value);
    52. }
    53. request.getRequestDispatcher(path).forward(request,response);
    54. }
    55. }
    56. }
    57. }
    1. package web;
    2. import java.util.HashMap;
    3. import java.util.Map;
    4. import java.util.Set;
    5. public class ModelAndView {
    6. private String viewName;//05.jsp
    7. private Map<String,Object> values=new HashMap<>();
    8. public String getViewName() {
    9. return viewName;
    10. }
    11. public void setViewName(String viewName) {
    12. this.viewName = viewName;
    13. }
    14. public void addObject(String key,Object value){
    15. values.put(key,value);
    16. }
    17. public Object getObject(String key){
    18. return values.get(key);
    19. }
    20. public Set<String> getObjectNames(){
    21. return values.keySet();
    22. }
    23. }
    1. package web.annotation;
    2. import java.lang.annotation.ElementType;
    3. import java.lang.annotation.Retention;
    4. import java.lang.annotation.RetentionPolicy;
    5. import java.lang.annotation.Target;
    6. @Target(ElementType.METHOD)
    7. @Retention(RetentionPolicy.RUNTIME)
    8. public @interface ResponseBody {
    9. }

    image.png
    image.png